PHP [SQL Injection] SQL 인젝션 방어 함수, mysql_real_escape_string
페이지 정보
본문
php버전 : php 4.3.0 ~ PHP 5.x
SQL 인젝션 공격은 ID나 PASSWORD 입력칸에 SQL문을 넣어서 DB를 터는 것을 말한다.
SQL 인젝션 공격의 예
<?php
// 유저가 있는지 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 ''=''
?>
모범 예제
<?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";
}
?>
참고자료
http://mytory.co.kr/archives/961
http://www.php.net/manual/kr/function.mysql-real-escape-string.php
SQL 인젝션 공격은 ID나 PASSWORD 입력칸에 SQL문을 넣어서 DB를 터는 것을 말한다.
SQL 인젝션 공격의 예
<?php
// 유저가 있는지 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 ''=''
?>
모범 예제
<?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";
}
?>
참고자료
http://mytory.co.kr/archives/961
http://www.php.net/manual/kr/function.mysql-real-escape-string.php
댓글목록
등록된 댓글이 없습니다.