우주용사

SQL Injection 막기

· 2021-01-28 (목) 10:10:50 · 8857 · 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 메소드를 쓰시면 됩니다.
감사합니다
댓글을 작성하시려면 로그인이 필요합니다.

그누보드5 팁자료실

2,788건
+
제목 글쓴이 날짜 조회
21-04-01 조회 6,185
21-03-27 조회 6,848
21-03-16 조회 6,028
21-03-16 조회 6,735
21-03-15 조회 8,030
21-03-10 조회 4,912
21-03-09 조회 7,430
21-03-09 조회 8,290
21-03-08 조회 5,891
21-03-08 조회 8,720
21-03-07 조회 5,213
21-03-05 조회 5,852
21-03-04 조회 7,945
21-02-26 조회 5,935
21-02-24 조회 5,096
21-02-20 조회 8,408
21-02-16 조회 7,457
21-02-16 조회 5,447
21-02-14 조회 1.5만
21-02-11 조회 6,905
21-02-03 조회 5,533
21-02-01 조회 5,723
21-01-31 조회 7,598
21-01-30 조회 5,110
21-01-29 조회 6,453
21-01-29 조회 6,016
21-01-28 조회 6,449
21-01-28 조회 8,858
21-01-26 조회 4,890
21-01-26 조회 6,923