SQL Injection이란 해커에 의해 조작된 SQL쿼리문이 데이터베이스에 그대로 전달되어 비정상적인 명령을 실행시키는 공격기법입니다.
먼저 게시글을 올리는 웹페이지가 있다고 가정해봅시다.
게시글에 HELLO WORLD를 작성하여 업로드하면 웹서버는 다음 SQL을 실행합니다.
INSERT INTO board(id, contents) VALUES (100, 'HELLO WORLD');
그럼 이때 해커가 '); DROP ALL TABLES;를 입력하게 된다면 어떨까요?
다음과 같은 쿼리문이 데이터베이스에 날아가게 됩니다.
INSERT INTO board(id, contents) VALUES (100, '');
DROP ALL TABLES;
');
이처럼 개발자가 의도치않은 DROP ALL TABLES 라는 쿼리문이 실행되게 됩니다. 이밖에도 기본 쿼리문의 WHERE절에 OR '1'='1'이런식으로 true문을 작성하여 무조건 적용되도록 수정한 뒤 DB를 조작할 수 도 있는 공격입니다.
위와 같은 상황에서 검증로직을 추가하여 미리 설정한 특수문자가 들어왔을 때 요청을 막아내는 방법이 있습니다.
→ 대부분의 라이브러리 혹은 프레임워크들은 특수문자를 자동으로 escaping해줍니다. 특히 prepare statement를 사용하면 전달인자값을 ?로 받아 서버측에서 필터링 과정을 적용하죠. 이로인해 sql injection 공격에 대응할 수 있습니다.