SQL Injection 막기 정보
SQL Injection 막기본문
MySQL에 검증되지 않은 사용자 입력값을 전달하는 것이 얼마나 위험한지 알아보겠습니다.
다음과 같이 사용자가 입력한 값을 전달할 때 검사하는 간단한 코드가 있다고 생각해봅시다.
$user = $_POST['user'];
$pass = $_POST['pass'];
$query = "SELECT * FROM users WHERE user='$user' AND pass='$pass'";
한눈에 보면 이 코드는 완벽해 보입니다 .
사용자가 $user와 $pass에 myuser, mypassword 라고 입력했다고 가정하면,
SELECT * FROM users WHERE user='$myuser' AND pass='mypassword'
이런식으로 전달이 될 것 입니다.
하지만 해커가 $pass는 아무것도 넣지 않은 상태로 다음과 같이 $user를 입력하면 어떻게 되겠습니까?
admin' #
이렇게 입력하면 MySQL로 전달된 값은 다음과 같을 것 입니다.
SELECT * FROM users WHERE user='admin' #' AND pass=''
MySQL에서 #은 주석의 시작을 의미 합니다.
따라서 해커는 암호를 넣을 필요가 업이 admin으로 로그인 됩니다.
또한, admin으로 사용자 계정을 제거하는 경우도 발생할 수 있습니다.
$user = $_POST['user'];
$pass = $_POST['pass'];
$query = "DELETE FROM users WHERE user='$user' AND pass='$pass'";
이 코드 역시 정상적으로 보입니다.
만약 해커가 다음 처럼 입력하면 어떻게 될까요??
anything' OR 1=1 #
MySQL에서는 다음과 같이 해석하게 됩니다.
DELETE FROM users WHERE user='anything' OR 1=1 #' AND pass=''
이 SQL 쿼리는 항상 참이므로 users 데이터베이스를 잃어버립니다.
이런 공격에 어떻게 대응할 수 있을까요?
이것은 해커가 따옴표를 먼저 입력해서 SQL 구문 해석에 오류가 생기게 만들어
관리자계정으로 명령을 내리는 경우 입니다.
따라서 사용자 입력값에서 따옴표를 없애고 알맞게 바꿔주는 함수를 사용해야 합니다.
<?php
$user = mysql_fix_string($_POST['user']);
$pass = mysql_fix_string($_POST['pass']);
$query = "SELECT * FROM users WHERE user='$user' AND pass='$pass'";
function mysql_fix_string($string)
{
if (get_magic_quotes_gpc()) $string = stripslashes($string);
return mysql_real_escape_string($string);
}
?>
get_magic_quotes_gpc() 함수는 따옴표가 활성화되어 있으면 참을 반환합니다.
stripslashes()함수는 슬래쉬를 제거해주는 함수 입니다.
참고서적 : Learning PHP, MySQL , JavaScript & CSS
get_magic_quotes_gpc함수는 php5까지밖에 지원이 안되는 걸로 알고 있습니다.
혹시 다른 방법을 알고 계시는 분이 계신다면 알려주시면 감사하겠습니다.
4
댓글 4개
sql_real_escape_string 이 준비되어 있습니다.
PDO를 사용하신다면, bind param 이나, quote 메소드를 쓰시면 됩니다.