2026, 새로운 도약을 시작합니다.

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개

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

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

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

그누보드5 팁자료실

번호 제목 글쓴이 날짜 조회
공지 3년 전 조회 4,598
2741 3일 전 조회 112
2740 4일 전 조회 104
2739 1주 전 조회 209
2738 1주 전 조회 217
2737 1주 전 조회 181
2736 1주 전 조회 280
2735 3주 전 조회 281
2734 3주 전 조회 263
2733 1개월 전 조회 265
2732 1개월 전 조회 301
2731 1개월 전 조회 267
2730 1개월 전 조회 226
2729 1개월 전 조회 356
2728 1개월 전 조회 245
2727 1개월 전 조회 422
2726 1개월 전 조회 256
2725 1개월 전 조회 330
2724 1개월 전 조회 358
2723 1개월 전 조회 267
2722 1개월 전 조회 300
2721 1개월 전 조회 211
2720 2개월 전 조회 304
2719 2개월 전 조회 307
2718 2개월 전 조회 202
2717 2개월 전 조회 336
2716 2개월 전 조회 202
2715 2개월 전 조회 312
2714 2개월 전 조회 273
2713 2개월 전 조회 376
2712 2개월 전 조회 289
🐛 버그신고