테스트 사이트 - 개발 중인 베타 버전입니다

SQL Injection 막기

· 4년 전 · 6583 · 4

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개

유익한 정보를 공유해 주셔서 감사합니다.
고급정보네요~~ 감사합니다~
그누보드 함수에선
sql_real_escape_string 이 준비되어 있습니다.

PDO를 사용하신다면, bind param 이나, quote 메소드를 쓰시면 됩니다.
감사합니다

게시글 목록

번호 제목
24318
24317
24315
24309
24294
24293
24277
24262
24260
24253
24251
24236
24233
24228
24226
24221
24214
24203
24201
24199
24196
24195
24194
24192
24191
24187
24185
24183
24172
24168