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를 조작할 수 도 있는 공격입니다.

🤪 방어 방법

  1. Input값을 받을 때 특수문자 여부 검사하기

위와 같은 상황에서 검증로직을 추가하여 미리 설정한 특수문자가 들어왔을 때 요청을 막아내는 방법이 있습니다.

  1. 라이브러리 혹은 프레임워크 사용하기

→ 대부분의 라이브러리 혹은 프레임워크들은 특수문자를 자동으로 escaping해줍니다. 특히 prepare statement를 사용하면 전달인자값을 ?로 받아 서버측에서 필터링 과정을 적용하죠. 이로인해 sql injection 공격에 대응할 수 있습니다.