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);
?>