PHP mysql_real_escape_string() 함수

정의 및 사용법

mysql_real_escape_string() 함수는 SQL 문장에서 사용되는 문자열의 특수 문자를 대체합니다.

영향을 받는 문자는 다음과 같습니다:

  • \x00
  • \n
  • \r
  • \
  • '
  • "
  • \x1a

성공하면 이 함수는 대체된 문자열을 반환합니다. 실패하면 false를 반환합니다.

문법

mysql_real_escape_string(string,connection)
매개변수 설명
string 필수. 대체할 문자를 지정합니다.
connection 선택 사항. MySQL 연결을 지정합니다. 지정하지 않으면 가장 마지막 연결이 사용됩니다.

설명

이 함수는 string 내부의 특수 문자를 대체하고, 현재 연결의 문자 집합을 고려하여 안전하게 사용할 수 있습니다. mysql_query().

ヒント 및コメント

ヒント:이 함수를 사용하여 데이터베이스 공격을 예방할 수 있습니다.

예제

예제 1

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
// 사용자 이름과 비밀번호를 얻는 코드
// 사용자 이름과 비밀번호를 표시하여 SQL에서 사용할 수 있게 합니다
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'"
// 더 많은 코드
mysql_close($con);
?>

예제 2

데이터베이스 공격. 이 예제에서 mysql_real_escape_string() 함수를 사용하지 않으면 어떻게 될지 보여줍니다:

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
$sql = "SELECT * FROM users
WHERE user='{$_POST['user']}'
AND password='{$_POST['pwd']}'";
mysql_query($sql);
// 사용자 이름과 비밀번호를 확인하지 않습니다
// 사용자 입력의 어떤 내용이든 될 수 있습니다. 예를 들어:
$_POST['user'] = 'john';
$_POST['pwd'] = "' OR ''='";
// 일부 코드...
mysql_close($con);
?>

그렇다면 SQL 쿼리는 이렇게 될 것입니다:

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

이는 어떤 사용자도 합법적인 비밀번호를 입력하지 않고도 로그인할 수 있다는 것을 의미합니다.

예제 3

데이터베이스 공격을 예방하는 올바른 방법:

<?php
function check_input($value)
{
// 슬래시 제거
if (get_magic_quotes_gpc())
  {
  $value = stripslashes($value);
  }
// 숫자가 아니면 쌍따옴표 추가
if (!is_numeric($value))
  {
  $value = "'" . mysql_real_escape_string($value) . "'";
  }
return $value;
}
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
// 안전한 SQL 수행
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";
mysql_query($sql);
mysql_close($con);
?>