SQL Injection 막기 > 그누보드5 팁자료실

그누보드5 팁자료실

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 메소드를 쓰시면 됩니다.
전체 2,411 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT