sql 인젝션 공격이란?
참고 : http://blog.naver.com/myefhc/100119445401
sql 인젝션 방어
참고 : http://kr2.php.net/manual/en/security.magicquotes.whynot.php
출처 : http://blog.naver.com/tinenie/110016874721
출처 : http://b.mytears.org/tag/array_map
==================================================================================================
sql injection 을 피하기 위해 single quote 를 escape 시켜주는 코드를 작성해야할 필요가 있었는데, 매번 하나하나에 대해 mysql_real_escape_string 을 호출해주는 건 너무나도 번거로웠다. 뭔가 간단하게 처리할 방법이 없을까 하고 찾아봤더니 왠걸! array_map 이라는 마법의 함수를 발견할 수 있었다.
common function 들을 정의해놓은 파일 맨 아래 저 코드를 삽입해버리니 sql injection 따위 이제 두려워할 필요가 없어졌다. 움하하핫!!
p.s) 그냥 array_map 에 stripslashes 나 mysql_real_escape_string 을 사용하게 되면 array 가 넘어온 경우 문제가 생길 수 있어서 약간 수정을 했습니다.
==================================================================================================
#### 1. 일반 SQL
$query = "select userid, password from user_table where userid='" . $_POST["userid"] . "' and password = '" . $_POST["password"] . "'";
userid 가 "username' #" 이면 password 부분은 주석 처리됨..
- MySQL 에서 # 가 주석
- Oracle 에서 -- 가 주석
##==> 해결
' 를 못 쓰게 하면 된다.
mysql 에서 다음 함수 이용 or addslashes() 함수 이용..
- mysql_escape_string()
- mysql_real_escape_string()
========================================
#▶mysql SQL 사용 변수 check
# ' 를 사용 못하게 한다.
# 특수 문자가 하나라도 있으면 false 반환
function mysql_check( $array ) {
foreach ($array as $str) {
$pos = strpos($str, "'");
if ($pos === false) continue;
return false;
}
return true;
}
# SQL에 사용할 변수 검사
if (!mysql_check( array($email, $passwd) )) echo_error("검색 실패");
#### 2. ' 가 없는 SQL
$query = "select * from user_table where type=". $_POST["type"] . "' ";
type 에 주석(#) 및 종료 문자( ; ) 등을 이용하여 공격을 할 수 있다.
##==> 해결
php에서 제공하는 escape_string 를 이용하는게 좋습니다.
mysql_escape_string()
pg_escape_string()
sqlite_escape_string()
$_POST = array_map('mysql_escape_string', $_POST);
#################################
# Reference
#################################
php|architect's Guide to PHP Security 라는 책의 Chapter 3, SQL Injection 내용이 Mysql 사이트에 공개되어 있습니다.
http://dev.mysql.com/tech-resources/articles/guide-to-php-security.html
'MySQL' 카테고리의 다른 글
테이블 내 특정 문자열 한꺼번에 바꾸기 - REPLACE (0) | 2012.08.30 |
---|---|
MySQL / FullText에서 특정 단어를 빠르게 검색하기 (0) | 2012.08.30 |
SQL injection, SQL 주입 공격, SQL 주입 취약점 (0) | 2012.07.31 |
mysql 정리 (0) | 2012.01.06 |
mysql date 함수 (0) | 2012.01.05 |