Post

SQL injection Mitigation - preparedStatement

SQL 구문을 미리 preparedStatement로 확정시켜 놓고 거기에 파라미터만 대입하는 형식으로 사용하면 SQL 구조가 외부 입력값에 의해서 변경되는 것을 방지할 수 있다.

SQL문 실행 순서는 다음과 같다.
1
2
3
SQL 구문 분석 -> 컴파일 -> 쿼리 실행

preparedStatement 사용하지 않는 동적 쿼리 구조 : id로 어떤 값이 넘어오느냐에 따라 쿼리 구조가 변경될 수 있다.
1
2
3
4
String sql = "select \* from tbl where id=" + id;
statement(sql)  // 구문 분석 & 컴파일
// 쿼리 실행

preparedStatement 사용하는 동적 쿼리 구조 : id에 어떤 값이 오든 쿼리 구조는 이미 확정된 상태.
1
2
3
4
5
String sql = "select \* from tbl where id=?";
prepareStatement(sql);  // 구문 분석 & 컴파일
setString(1, id);  // 바인딩
// 쿼리 실행

파라미터가 유입되는 동적 쿼리를 사용하는 경우

  • SQL 취약점을 막고 싶다면 prepared statement를 사용하는 것이 제일 낫지만
  • 이를 사용할 수 없는 경우 DB에서 지원하는 함수를 이용하여 escape
  • 이마저도 사용할 수 없을 때 addslashes()같은 언어 차원에서 제공하는 기타 다른 방법을 사용
This post is licensed under CC BY 4.0 by the author.