20.2. 보안 2/2 - SQL Injection
입력값을 통해서 sql문을 서버로 주입했다. 이것을 sql injection이라고 한다.
이번엔 자동으로 주입을 막는 기능을 사용하지 않았을때 상황을 만들어 볼것이다.
WHERE topic.id= 이부분에 물음표로 치환하지 않고 바로 데이터를 넣어본다.
그리고 DROP TABLE Injection을 해본다.
sql문 에러가 있다고 뜬다.
sql문을 변수에 담고 콘솔에 출력해보면 어떠한 sql문이 실제로 전송됐는지 볼 수 있다.
콘솔에 출력해 보면 이런식으로 sql문이 생성됐다는걸 알 수 있다. 두개의 sql문이 세미콜론으로 연결됐고
drop table 명령어가 실행되어야 한다.
하지만 db.query 라는 메소드가 한번에 여러개의 sql문이 실행되는것을 기본적으로 막아놨다.
그렇다면 한번에 여러개의 sql문을 실행할 수 있도록 하는 방법은
데이터베이스 접속을 담당하는 db.js에 가서
multipleStatements를 true로 설정해주면 된다.
그러면 db.query란 메소드는 여러개의 메소드를 허용한다.
다시 DROP TABLE Injection을 하면
topic 테이블이 삭제된다.
즉, 기본적으로 db.query는 한번에 하나의 sql문만 입력받고 전송 할 수 있도록 되어있다.
쓸일이 없겠지만, 강제로 한번에 여러개의 sql문을 전송하려면 multipleStatements를 true로 설정해주면된다.
-------------------------------------------------------------------------------------------------------------------------
쿼리문을 치환하지 않고 안전하게 보내기 위한 또다른 방법은
db.escape로 묶어주는 방법이 있다.