PHP 공식 한글 설명 : mysql_real_escape_string
SQL 인젝션 공격은 ID나 PASSWORD 입력칸에 SQL문을 넣어서 DB를 터는 것을 말한다.
PHP 공식 웹사이트에는 SQL 인젝션 공격의 예로 아래와 같은 것을 들어 놓고 있다.
// 유저가 있는지 DB에서 체크하는 쿼리 $query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'"; mysql_query($query); // $_POST['password']를 체크할 수 없게 되고, 어떤 유저든 허용하게 된다. 예를 들면: $_POST['username'] = 'aidan'; $_POST['password'] = "' OR ''='"; // MySQL에 이런 쿼리가 전송된다는 것을 의미한다: echo $query; //SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
mysql_real_escape_string 함수는 바로 이런 공격을 막아 주는 함수다.
PHP 공식 웹사이트에는 아래를 모범 예제로 들고 있다.
if (isset($_POST['product_name']) && isset($_POST['product_description']) && isset($_POST['user_id'])) { // 접속 $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password'); if(!is_resource($link)) { echo "서버 접속 실패\n"; // ... 오류를 적절히 기록 } else { // ON일 경우 magic_quotes_gpc/magic_quotes_sybase 효과 제거 if(get_magic_quotes_gpc()) { $product_name = stripslashes($_POST['product_name']); $product_description = stripslashes($_POST['product_description']); } else { $product_name = $_POST['product_name']; $product_description = $_POST['product_description']; } // 안전한 질의 만들기 $query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', %d)", mysql_real_escape_string($product_name, $link), mysql_real_escape_string($product_description, $link), $_POST['user_id']); mysql_query($query, $link); if (mysql_affected_rows($link) > 0) { echo "Product inserted\n"; } } } else { echo "Fill the form property\n"; }
위와 같은 방식으로 사용하면 된다.
[SQL] INT 형을 입력할 때도 작은 따옴표로 감싸야 한다 에 응답 남기기응답 취소