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년 전 | 4414 | ||
| 2604 | 8개월 전 | 674 | ||
| 2603 | 8개월 전 | 734 | ||
| 2602 | 8개월 전 | 648 | ||
| 2601 |
|
8개월 전 | 671 | |
| 2600 |
|
8개월 전 | 579 | |
| 2599 | 8개월 전 | 809 | ||
| 2598 | 8개월 전 | 602 | ||
| 2597 |
다케미카코
|
8개월 전 | 756 | |
| 2596 | 8개월 전 | 854 | ||
| 2595 |
|
8개월 전 | 446 | |
| 2594 | 9개월 전 | 608 | ||
| 2593 |
만두먹고또먹고
|
9개월 전 | 938 | |
| 2592 | 9개월 전 | 612 | ||
| 2591 | 9개월 전 | 620 | ||
| 2590 | 9개월 전 | 688 | ||
| 2589 |
|
9개월 전 | 758 | |
| 2588 | 9개월 전 | 477 | ||
| 2587 | 9개월 전 | 796 | ||
| 2586 | 9개월 전 | 643 | ||
| 2585 | 9개월 전 | 511 | ||
| 2584 | 9개월 전 | 577 | ||
| 2583 | 9개월 전 | 498 | ||
| 2582 | 9개월 전 | 643 | ||
| 2581 | 9개월 전 | 598 | ||
| 2580 |
만두먹고또먹고
|
9개월 전 | 517 | |
| 2579 |
|
9개월 전 | 664 | |
| 2578 | 9개월 전 | 647 | ||
| 2577 | 9개월 전 | 627 | ||
| 2576 | 9개월 전 | 562 | ||
| 2575 |
이슈DEV
|
10개월 전 | 993 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기