혼자 공부하는 자바스크립트 책 반납기간이 하루남아서 하루동안 내가 알고 있는 지식 외에 모든 자료를 정리해 보려고한다.

 

키워드

자바스크립트 초기에 만들어 놓은 키워드 ex) case, break, true, typeof, etc...

식별자

코드를 작성할 때 변수명이나 함수명에 사용되는 단어 (함수명에 사용된다는 것은 해당 함수를 적으면 해당함수에 해당 하는 코드를 가져온다는 의미이기도함)

규칙

(1) 키워드 사용 x

(2) 숫자로 시작 x

(3) 특수 문자는 _, & 만 허용

(4) 공백 포함 x

구분 단독 사용 다른 식별자와 사용
식별자 뒤 괄호 X 변수 속성
식별자 뒤 괄호 O 함수 메소드

const  상수 저장 키워드

let       변수 저장 키워드

 

증감 연산자

변수 ++ 함수 실행 후 1을 더한다

++ 변수 함수 실행 전 1을 더한다

 

문자열 입력 함수

prompt(입력창 내용, 입력 기본값)

 

boolean 입력 함수

confirm('수락하시겠습니까?')  ← 확인 취소 창이 뜸

 

문자열 < > 숫자 자료형 변환방법

number()

String()

 

불 자료형의 경우 변환시 boolean 혹은 !! 붙이면 변환

0, NaN, ... , 빈 문자열, null, undefiend 이 5가진느 false 로 변환 나머지는 다 True

 

조건문

if else 문

switch 문

 

조건부 연산자

불 표현식 ? 참일때 결과 : 거짓일때 결과

const result = (number >=0) ? '0 이상 숫자'  : '0 이하 숫자'

 

짧은 조건문

false || console.log('hi')

false일 경우에만 hi가 출력됨 

&& 을 사용할 시

true일 경우에만 hi 출력

 

 컴퓨터는 비교보다는 숫자를 사용하는 형태로 프로그램으로 짜는게 더 좋다.

 

배열

length 배열 안에 요소 갯수를 알려준다.

push 요소를 추가해준다.

배열이 10개까지만 있어도 fruit[20] 하면 20 번째에 값이 들어가고 값이 없는 곳은 empty로 출력

splice 요소 제거

배열.splice(인덱스, 제거할 요소 갯수)

indexOf 를 통해 몇번째에 검색할 값이 있는지 확인 후 인덱스를 보내고 그것을 splice에 집어넣어 잘나내기를 한다.

배열. splice(인덱스, 0 , 요소) 이를 사용하면 요소를 지정한 인덱스 위치에 추가한다.

 

현재에는 비파과 처리를 주로 사용함 그전에는 메모리 문제 때문에 파괴 처리를 하였지만, 현재 메모리는 여유로운 상태

for ( i in 배열) ← 배열의 요소 갯수만큼 반복 i 숫자

for( i of 배열) ← i의 입력이 배열값이 들어간다.

for(let i = 0; i < 반복횟수 i++)

continue 를 쓰면 다음 반복문으로 넘어간다. continue 아래 문구 패스

 

 매개변수

나머지 매개변수

만약 내가 만든 함수의 입력값에 배열을 직접 넣어야하는 상황이 생긴다면 매번 대괄호를 넣기 힘들기 때문에

...매개변수 즉 점 3개를 앞에 써주면 1, 2, 3 을 넣어줘도 [1,2,3] 이라는 배열로 인식하게 된다.

 

콜백 함수 ← 다른 함수를 매개변수로 가져올 수 있다.

 

익명 함수  ← 안전을 위해 익명 함수 사용하는 것이 더 안전

익명 함수를 사용 하면 우리가 글을 읽는 순에 맨 마지막 함수가 호출 함수로 지정

선언적 함수

선언적 함수도 쓰여서 콜할 수 있지만 호출되는 함수가 다를 수 있기 때문에 유의

 

객체는 배열과 비슷한 형태

typeof([]) 하면 object를 반환

배열은 인덱스와 요소가 있다면 객체는 키와 속성이 존재한다.

아래와 같은 객체가 존재한다면 과일,유형, 원산지는 Key이고 사과,열대과일 등은 속성이 되는 것이다.

다른 글에도 객체에 대해 설명했는데 학교라는 큰 틀에 교실이 있고 그 안에 교실의 key인 학생 인원이 있고 속성은 실제 학생수를 지칭하는 것을 예로 들 수 있겠다. 

const product = {
	과일: '사과, 바나나, 멜론',
        유형: '열대과일',
        원산지: '필리핀, 베트남'
        }

procut['과일']  시 사과,바나나,멜론 출력 이와 같은 출력 문구로는 product.과일 도 동일 출력

공백등이 존재할 때는 쿼터(") 를 사용하여 문자열로 지칭해줘야한다.

메소드(method) 는 속성이 일반값이 아니라 값을 입력받아야하는 경우 이러한 함수 자료형을 메소드라 부름

this 를 사용하면 자신의 속성에 접근 가능하다.

 

동적으로 객체 속성  추가 및 제거

const student = {}

student.이름 = '하윤성'

delete student.이름

하면 student에는 이름 : '하윤성' 이 들어갔다가 삭제되어 {}로 나오게 된다.

 

기본 자료형은 객체를 제외한 형태로써 숫자, 문자열, 불이 기본 자료형이다.

그래서 속성을 지정해줘도 undefiend가 나오게 된다. 그렇다면 어떻게 해야할까 그 해답은 객체를 선언하는 것이다.

const 객체 = new 객체 자료형 이름()

기본 자료형의 경우 메소드들이 나오는데 이 경우 일시적으로 객체로 상승시켜주는 것으로 호출 후에는 기본 자료형으로 돌아온다.

 

JSON(Javascript Object Notation) 자바스크르빝의 객체처럼 자료를 표현하는 방식

얕은 복사 : 특정 배열을 복사한 후 push를 하면 두 배열 모두 push한 값을 갖는다. 

깊은 복사 : 특정 배열을 복사 할 때 ...배열로 복사를 하면 push한 값은 한 쪽 배열에만 들어간다. - 두 객체를 완전하게 독립적으로 사용

 

객체 지향 패러다임 : 객체를 우선적으로 생각하여 프로그램을 만든다는 방법론

추상화 : 프로그램에서 필요한 요소만을 사용해서 개체를 표현하는 것을 의미

클래스 : 객체를 안전하고 효율적으로 만들 수 있게 해주는 문법

인스턴스 : 클래스를 기반으로 생성한 객체

생성자 : 클래스를 기반으로 인스턴스를 생성할 때 처음 호출되는 메소드이다.

 

 

 

 

출처:https://systemweakness.com/lab-blind-sql-injection-with-time-delays-and-information-retrieval-2468e1cd81d0

SQL injection이란 구동중이 앱이나 웹 내에서 저장된 데이터베이스와 질의하는 과정에 사용되는 SQL 쿼리를 조작하여 데이터베이스의 정보를 빼가거나 공격자가 해당 서버의 root 권한을 습득하는 공격 방식이다.

취약점 1순위로 가장 많이 사용되는 취약점이다.

 

SQL이  발생하는 이유

입력된 값과 데이터베이스가 소통을 할 때 필터링을 제대로 하지 않는 경우에 발생한다.

input문을 통해 데이터를 받고 그 데이터를 비교하기 위해서는 비교문이 들어갈 수 밖에 없다. 이 비교문도 일반 코드이기 때문에 만약 입력된 값이 코드형태로 입력되어 앞에 있는 비교문을 주석으로 만들어버리고 권한을 습득하도록 해버린다면 자동으로 권한이 뺏겨버리는 것이다.

예시를 하나 들자면 만약 로그인을 위해 아이디와 비밀번호를 입력하는 로그인 페이지가 있다면 웹에서는 입력된 아이디와 비밀번호를 계정 정보가 있는 데이터베이스와 비교하여 로그인을 승인시켜줄 것이다. 이때 대게 참거짓이 들어가게 되는데 이 부분에서 무조건 참으로 만들게 된다면 웹에서 로그인을 승인시켜줄 수 밖에 없는것이다.

select * from client where name='anjinma' and password='1234'

select * from client where name='anjinma' and password=' or '1'='1

위와 같이 or를 삽입하고 '1'='1이라는 문구를 사용하게 된다면 1=1은 무조건 참이기 때문에 비밀번호가 틀리더라도 1=1은 참이기 때문에 or문을 통해 전체가 참이되는 것이다. 이렇게 되면 바로 로그인이 되어버리게 된다.

 

SQL injection으로 할 수 있는 일

가장 대표적으로 하는 일은 데이터베이스에서 내가 원하는 데이터를 가져올 수 있다는 것이다. 그 데이터의 형태가 계좌명 아니면 비밀번호가 될 수 있지만 최고권한 아이디 비밀번호를 알아낼 수 있다면 그 서버를 마음대로 주무를 수 있기 때문이다. 이런 최고 권한을 가져오게 되면 내가 들어온 log 기록 과 같은 꼬리가 잡힐만한 것들을 쉽게 없앨 수 있기 때문에 매우 위험하다.

 

SQL injection을 막는 방법

아래 코드는 아까 위에서 사용했던 코드이다.  이 코드 중 공격코드는 ' or '1'='1 이다. 즉 '라는 특수문자가 앞의 코드를 중간에 끊어버리고 새로운 코드와 연결시켜줬기 때문에 이러한 공격이 가능했던 것이다.

그렇다면 이 특수문자를 입력하지 못하게 한다면 SQL injection은 어려움을 겪을 것이다. 그렇기 때문에 특수문자를 막는것이다.

대표적인 코드로 mysqli_real_escape_string()이 있는데 이코드는 sql에서 특별한 의미를 갖는 문자들을 만나면 escape를 통해 sql 삽입을 방지하는 방법이다.

select * from client where name='anjinma' and password=' or '1'='1

다른 방법으로는 javascript가 브라우저에서 임의로 끌 수 있기 때문에 서버에서 한번 더 체크를 해 특수문자가 입력되지 못하도록 해야한다.

3번째로 에러 문을 발생시키지 않도록하는 것이다. 에러문을 통해 대략적인 DB의 형태를 알 아 낼 수 있기때문에 오류문구를 뜨지 않게 해야한다.

+ Recent posts