mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)

mysql_real_escape_string — SQL 문에서 사용하기 위해 문자열의 특수 문자를 이스케이프합니다.

경고 이 확장은 PHP 5.5.0에서 더 이상 사용되지 않으며 PHP 7.0.0에서 제거되었습니다. 대신 MySQLi 또는 PDO_MySQL 확장을 사용해야 합니다. MySQL: API 선택 가이드도 참조하세요. 이 함수의 대안은 다음과 같습니다.


설명

mysql_real_escape_string(string $unescaped_string, resource $link_identifier = NULL): string

mysql_query()에 안전하게 배치할 수 있도록 연결의 현재 문자 집합을 고려하여 unscaped_string의 특수 문자를 이스케이프합니다. 바이너리 데이터를 삽입하려면 이 기능을 사용해야 합니다.

mysql_real_escape_string()\x00, \n, \r, \, ', "\x1a 문자 앞에 백슬래시를 추가하는 MySQL의 라이브러리 함수 mysql_real_escape_string을 호출합니다.

이 함수는 MySQL에 쿼리를 보내기 전에 데이터를 안전하게 만들기 위해 항상(몇 가지 예외를 제외하고) 사용해야 합니다.

주의

보안: 기본 문자 집합

문자 집합은 서버 수준에서 설정하거나 mysql_real_escape_string()에 영향을 미치도록 API 함수 mysql_set_charset()을 사용하여 설정해야 합니다. 자세한 내용은 문자 집합에 대한 개념 섹션을 참조하세요.


매개변수

unescaped_string
이스케이프할 문자열입니다.
link_identifier
MySQL 연결. 링크 식별자가 지정되지 않으면 mysql_connect()에 의해 열린 마지막 링크가 가정됩니다. 그러한 링크가 발견되지 않으면 mysql_connect()가 인수 없이 호출된 것처럼 링크를 생성하려고 시도합니다. 연결을 찾거나 설정하지 않으면 E_WARNING 수준 오류가 생성됩니다.

반환 값

이스케이프된 문자열을 반환하거나 오류가 발생하면 false를 반환합니다.


오류/예외

MySQL 연결 없이 이 함수를 실행하면 E_WARNING 수준 PHP 오류도 발생합니다. 유효한 MySQL 연결이 있는 경우에만 이 기능을 실행하십시오.


Examples

예제 #1 Simple mysql_real_escape_string() 예제

                  
<?php
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
    OR die(mysql_error());

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));
?>
                  
                

예제 #2 mysql_real_escape_string()에는 연결 예제가 필요합니다.

이 예제는 이 함수를 호출할 때 MySQL 연결이 없으면 어떻게 되는지 보여줍니다.

                  
<?php
// We have not connected to MySQL

$lastname  = "O'Reilly";
$_lastname = mysql_real_escape_string($lastname);

$query = "SELECT * FROM actors WHERE last_name = '$_lastname'";

var_dump($_lastname);
var_dump($query);
?>
                  
                

위의 예는 다음과 유사한 결과를 출력합니다.

Warning: mysql_real_escape_string(): No such file or directory in /this/test/script.php on line 5
Warning: mysql_real_escape_string(): A link to the server could not be established in /this/test/script.php on line 5

bool(false)
string(41) "SELECT * FROM actors WHERE last_name = ''"
                

예제 #3 SQL 주입 공격의 예

                  
<?php
// We didn't check $_POST['password'], it could be anything the user wanted! For example:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// Query database to check if there are any matching users
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// This means the query sent to MySQL would be:
echo $query;
?>
                  
                

MySQL에 보낸 쿼리:

SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
                

이렇게 하면 누구나 유효한 암호 없이 로그인할 수 있습니다.


노트

참고:

mysql_real_escape_string()을 사용하기 전에 MySQL 연결이 필요합니다. 그렇지 않으면 E_WARNING 수준의 오류가 생성되고 false가 반환됩니다. link_identifier가 정의되어 있지 않으면 마지막 MySQL 연결이 사용됩니다.

참고:

magic_quotes_gpc가 활성화된 경우 먼저 데이터에 stripslashes()를 적용합니다. 이미 이스케이프된 데이터에 이 함수를 사용하면 데이터가 두 번 이스케이프됩니다.

참고:

이 함수를 사용하여 데이터를 탈출하지 않으면 쿼리는 SQL 주입 공격에 취약합니다.

참고:

mysql_real_escape_string()%_를 이스케이프하지 않습니다. LIKE, GRANT 또는 REVOKE와 결합된 경우 MySQL의 와일드카드입니다.


기타