SQL injection Mitigation : preparedStatement
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' 카테고리의 다른 글
Padding Oracle Attack (0) | 2017.11.27 |
---|---|
LFI, Local File Inclusion (0) | 2017.11.23 |
WebDAV / CVE-2017-7269 (0) | 2017.11.15 |
Webshell pattern 웹쉘 패턴 (0) | 2017.10.28 |
redis를 통해 webshell upload (0) | 2017.10.05 |