본문으로 바로가기

[PHP] injection SQL 해킹 대응책

category Helloworld!/PHP 2012. 12. 27. 16:30
1. 일반 대책
-데이터베이스와 연동을 하는 스크립트의 모든 파라미터들을 점검하여 사용자의 입력 값이 SQL injection을 발생시키지 않도록 수정한다.
-사용자 입력이 SQL injection을 발생시키지 않도록 사용자 입력 시 특수문자(’ ” / \ ; : Space — +등)가 포함되어 있는지 검사하여 허용되지 않은 문자열이나 문자가 포함된 경우에는 에러로 처리한다.
-SQL 서버의 에러 메시지를 사용자에게 보여주지 않도록 설정한다. 공격자는 리턴 되는 에러 메시지에 대한 분석을 통하여 공격에 성공할 수 있는 SQL Injection 스트링을 알아낼 수 있다. 따라서 SQL 서버의 에러 메시지를 외부에 제공하지 않도록 한다.
- 웹 애플리케이션이 사용하는 데이터베이스 사용자의 권한을 제한한다. 가능하면 일반 사용자 권한으로는 모든 system stored procedures에 접근하지 못하도록 하여 웹 애플리케이션의 SQL Injection 취약점을 이용하여 데이터베이스 전체에 대한 제어권을 얻거나 데이터베이스를 운용중인 서버에 대한 접근이 불가능하도록 한다.
-php.ini 설정 변경 : php.ini 설정 중 magic_quotes_gpc 값을 On으로 설정한다.

Magic quotes
Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On  ; Off에서 On으로 변경한다.
Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
Use Sybase-style magic quotes (escape ’ with ” instead of ').
magic_quotes_sybase = Off

2. PHP일경우 수정방법
- addslashes() 함수 사용
: 사용자가 입력하는 값들($_GET, $_POST)을 모두 addslashes() 함수를 이용하여 처리하여 준다.
: 용도? DB Query와 같이 인용된 부분앞에 역슬래쉬를 붙여서 반환한다. 해당 문자에는 작은 따옴표, 큰 따옴표, 역슬래쉬, NULL이 있다. SQL Injection 공격을 위해서 사용한다.
: 적용 가능한 PHP : PHP 3 이상
-안전한 SQL Injection 예제
$query = sprintf(“SELECT id,password,username FROM user_table WHERE id=’%s’;”,addslashes($id));
// id변수를 문자형으로 받고, id변수의 특수문자를 일반문자로 변환한다.
// @ 로 php 에러 메시지를 막는다.