사용자가 입력해서 들어오는 정보는 모두 오염(위험)되었다고 생각하고 애플리케이션을 설계할 것.

- 코드로 입력한 sql문이 어떻게 서버(데이터베이스)로부터 값을 받아와 실행되는지 값이 채워진 sql문을 보고 싶다면 작성한 query문을 따로 변수로 지정해 이를 console.log문에 넣어 콘솔창으로 실행된 sql문을 확인해보자.
- 콘솔창으로 실행된 sql문을 확인해보면 우리가 입력한 id=1뒤에 악의적으로 입력할 수 있는 sql문이 작은 따옴표 안에 들어간걸 확인할 수 있다. 이때 작은 따옴표 안에 들어간 sql문은 sql문이 아닌 그냥 문장이다. 따라서 악의적으로 공격의도로 sql문을 작성했으나 작은 따옴표 안에 들어가 공격이 먹히지 않았다.

- 어떻게 작은따옴표 안에 들어가있는걸까? 우리는 쿼리문을 작성할때 ?을 이용했는데, 이때 ?안에 들어가는 값은 query함수의 두번째 인자인 배열의 요소가 차례대로 치환되어 들어간다. 이렇게 sql문을 제어할 경우 사용자가 오염된 정보를 입력해도 안전하게 데이터베이스로 들어갈 수 있게끔 하는 처리가 발생한다.

- sql문으로 서버를 공격하는 방식을 sql injection이라고 하며 굉장히 위험하고 유명한 공격 방식이다.


- 이때 만약 ? 방식을 사용하지 않은 경우 어떻게 sql이 받아들여지는지 확인하기 위해 기존 코드를 주석처리하고 위에 sql문안에 직접 변수를 넣는 코드를 작성하고 새로운 변수를 만든 후 변수에 sql문을 넣어 console로 확인해보자.

- log을 보니 사용자가 작성한 sql문이 작은 따옴표 안에 있지 않고 일반적으로 sql문을 작성하듯 되어 있다. 그러나 오류가 나서 sql문이 실행이 안되었는데, 그 이유는 우리가 사용한 db메서드가 sql문이 2개 입력되어서 문제를 막기위해 오류를 발생시킨 것이다. 하마터면 테이블이 통째로 날라갈 뻔 했다.

- 이때 일부러 공격을 받아 경각심을 느끼기 위한 목적으로, 방어막 역할을 하는 db메서드의 기능을 무력화시키기 위해 db.js에 multipleStatements를 true로 설정해 sql문을 2개 이상 작성할 수 있도록 하자.


- node를 reload한 후 sql문을 작성하니, sql injection공격이 성공해 데이터베이스의 topic 테이블이 없어졌다.


- 만약 ?을 쓰지 않고 공격을 받지 않도록 하는 방법은 주석 위에 새로 작성한 코드처럼 db.escape() 안에 queryData.id를 넣자.

- 사용자가 입력한 정보는 오염되었다고 간주하고 살균하기 위해 sanitizeHtml 모듈을 설치하자.

- 이제 코드에 외부에서 입력된 정보를 모두 살균할 수 있게끔, 변수 명 앞에 sanitizeHtml을 추가하자.

- 변수명 앞에 sanitize를 추가할 때 변수의 관계를 잘 파악하면서 추가하자. 이 변수가 사용자로부터 입력받는 정보인지, 또 여러개의 파일에서 어떤 관계로 얽힌 변수인지, 서버로부터 받아오는 정보인지 확인하자.

- 이때 list를 만드는 코드 중 id값은 autoIncrement로 자동으로 들어오는 정보라 살균을 하지 않아도 된다.

- 그러나 title의 경우 사용자가 입력하는 정보이므로 살균이 필수적이다. 그 후 node를 reload해보니 오류가 발생하는데, 단순한 오타로 인한 오류이다. sanitizeHTML이 아닌 sanitizeHtml이다. 모듈 이름의 대,소문자를 구분해서 작성하자.

- 모듈을 불러오지 않아 오류가 발생해서 코드 맨 위에 모듈을 불러오자.

- 그런 다음 콤보박스의 author name 값은 사용자로부터 입력받는 정보라서 살균을 하자.


- 사용자가 입력하는 정보는 다 살균을 하자

- test를 위해 create의 title과 profile에 데이터를 입력해보자. 이때 profile에 script 태그를 넣어보자. script태그는 사용자에게 공격을 하는 태그로 오염된 정보를 한번 입력해봄으로써 살균이 잘 되나 확인한다.

- 출력된 작성자 목록을 보니 script태그 부분이 살균되어 삭제된 profile의 모습이다.

- 이때 author update 코드에서는 데이터베이스에서 값을 읽어올 때 오염된 값을 가져올 수 있을 수 있으므로 살균을 해주자.