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

 

SQL문 실행 순서는 다음과 같다.

```

SQL 구문 분석 -> 컴파일 -> 쿼리 실행

```

 

preparedStatement 사용하지 않는 동적 쿼리 구조 : id로 어떤 값이 넘어오느냐에 따라 쿼리 구조가 변경될 수 있다.

```java

String sql = "select * from tbl where id=" + id;

statement(sql)  // 구문 분석 & 컴파일

// 쿼리 실행

```

 

preparedStatement 사용하는 동적 쿼리 구조 : id에 어떤 값이 오든 쿼리 구조는 이미 확정된 상태.

```java

String sql = "select * from tbl where id=?";

prepareStatement(sql);  // 구문 분석 & 컴파일

setString(1, id);  // 바인딩

// 쿼리 실행

```

 

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

  • SQL 취약점을 막고 싶다면 prepared statement를 사용하는 것이 제일 낫지만
  • 이를 사용할 수 없는 경우 DB에서 지원하는 함수를 이용하여 escape
  • 이마저도 사용할 수 없을 때 ``php addslashes()``같은 언어 차원에서 제공하는 기타 다른 방법을 사용

 

'Security > WebHacking' 카테고리의 다른 글

SQL injection Mitigation : preparedStatement  (0) 2017.11.30
Padding Oracle Attack  (0) 2017.11.27
LFI, Local File Inclusion  (0) 2017.11.23
WebDAV / CVE-2017-7269  (0) 2017.11.15
redis를 통해 webshell upload  (0) 2017.10.05
XXE, XML eXternal Entity  (2) 2017.09.21