[PHP] sql injection 방어 함수, mysql_real_escape_string

PHP 공식 한글 설명 : mysql_real_escape_string

SQL 인젝션 공격은 ID나 PASSWORD 입력칸에 SQL문을 넣어서 DB를 터는 것을 말한다.

PHP 공식 웹사이트에는 SQL 인젝션 공격의 예로 아래와 같은 것을 들어 놓고 있다.

// 유저가 있는지 DB에서 체크하는 쿼리
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// $_POST['password']를 체크할 수 없게 되고, 어떤 유저든 허용하게 된다. 예를 들면:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// MySQL에 이런 쿼리가 전송된다는 것을 의미한다:
echo $query;
//SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''

mysql_real_escape_string 함수는 바로 이런 공격을 막아 주는 함수다.

PHP 공식 웹사이트에는 아래를 모범 예제로 들고 있다.

if (isset($_POST['product_name']) && isset($_POST['product_description']) && isset($_POST['user_id'])) {
    // 접속
    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');

    if(!is_resource($link)) {

        echo "서버 접속 실패\n";
        // ... 오류를 적절히 기록

    } else {

        // ON일 경우 magic_quotes_gpc/magic_quotes_sybase 효과 제거

        if(get_magic_quotes_gpc()) {
            $product_name        = stripslashes($_POST['product_name']);
            $product_description = stripslashes($_POST['product_description']);
        } else {
            $product_name        = $_POST['product_name'];
            $product_description = $_POST['product_description'];
        }

        // 안전한 질의 만들기
        $query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', %d)",
                    mysql_real_escape_string($product_name, $link),
                    mysql_real_escape_string($product_description, $link),
                    $_POST['user_id']);

        mysql_query($query, $link);

        if (mysql_affected_rows($link) > 0) {
            echo "Product inserted\n";
        }
    }
} else {
    echo "Fill the form property\n";
}

위와 같은 방식으로 사용하면 된다.

카테고리 글 목록 👉

대표글

“[PHP] sql injection 방어 함수, mysql_real_escape_string” 에 하나의 답글

  1. […] PHP의 SQL Injection 방어 함수도 있다. 참고해 보면 도움이 될 […]

댓글 남기기