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년 전 | 4417 | ||
| 1794 |
|
4년 전 | 5890 | |
| 1793 | 4년 전 | 2862 | ||
| 1792 |
|
4년 전 | 5292 | |
| 1791 |
iiliiiliii
|
4년 전 | 6016 | |
| 1790 |
iiliiiliii
|
4년 전 | 3885 | |
| 1789 |
iiliiiliii
|
4년 전 | 6218 | |
| 1788 |
|
4년 전 | 3316 | |
| 1787 | 4년 전 | 3791 | ||
| 1786 | 4년 전 | 5371 | ||
| 1785 | 4년 전 | 4000 | ||
| 1784 | 4년 전 | 3188 | ||
| 1783 | 4년 전 | 6368 | ||
| 1782 |
welcome
|
4년 전 | 5196 | |
| 1781 | 4년 전 | 3470 | ||
| 1780 | 4년 전 | 12229 | ||
| 1779 |
welcome
|
4년 전 | 4873 | |
| 1778 |
|
4년 전 | 3635 | |
| 1777 | 4년 전 | 3821 | ||
| 1776 | 4년 전 | 5450 | ||
| 1775 |
그누x쵸딩
|
4년 전 | 3136 | |
| 1774 |
슈퍼스타맨
|
4년 전 | 4385 | |
| 1773 | 4년 전 | 3996 | ||
| 1772 | 4년 전 | 4363 | ||
| 1771 | 4년 전 | 6594 | ||
| 1770 | 4년 전 | 2940 | ||
| 1769 | 4년 전 | 4925 | ||
| 1768 | 4년 전 | 5611 | ||
| 1767 | 4년 전 | 3717 | ||
| 1766 | 4년 전 | 2809 | ||
| 1765 | 4년 전 | 3046 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기