본문으로 건너뛰기
안형우

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

📌 CSS가 어려운 이유 — 프로젝트 중심 실전 CSS 강의 소개 2023-04-13
📌 워드프레스, 답답한 빌더와 플러그인 대신 시원하게 커스터마징하기(강의) 2023-01-15
📌 아무도 말하지 않는 PHP의 좋은 점 2018-10-13
📌 유지보수하기 쉬운 CSS 전략(슬라이드) 2016-12-20
📌 워드프레스 테마에서 템플릿 파일 매칭 순서 2013-05-12
📌 [번역] CSS 코드 냄새 2013-01-01

[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";
}

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

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

댓글 (1개)

Leave a Reply

Your email address will not be published. Required fields are marked *