SQL 인젝션 공격 방어

MySQL 2012. 7. 31. 14:10

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 이라는 마법의 함수를 발견할 수 있었다.

function stripslashes_deep($var){
    $var = is_array($var)?
                  array_map('stripslashes_deep', $var) :
                  stripslashes($var);
 
    return $var;
}
 
function mysql_real_escape_string_deep($var){
    $var = is_array($var)?
                  array_map('mysql_real_escape_string_deep', $var) :
                  mysql_real_escape_string($var);
 
    return $var;
}
 
if( get_magic_quotes_gpc() ){
    if( is_array($_POST) )
        $_POST = array_map( 'stripslashes_deep', $_POST );
    if( is_array($_GET) )
        $_GET = array_map( 'stripslashes_deep', $_GET );
}
 
if( is_array($_POST) )
    $_POST = array_map( 'mysql_real_escape_string_deep', $_POST );
if( is_array($_GET) )
    $_GET = array_map( 'mysql_real_escape_string_deep', $_GET);

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 

블로그 이미지

스마트전

,