現在の文字の接続設定を考慮して、unescaped_string 内の特殊文字をエスケープして、mysql_query() 内で安全に配置できるようにします。バイナリ データを挿入する場合は、この関数を使用する必要があります。
次の文字が影響を受けます:
成功した場合、この関数はエスケープされた文字列を返します。失敗した場合は false を返します。
mysql_real_escape_string(string,connection)
パラメータ | 説明 |
---|---|
文字列 | 必須。エスケープする文字列を指定します。 |
接続 | オプション。 MySQL 接続を指定します。指定しない場合は、以前の接続が使用されます。 |
説明
この関数は文字列内の特殊文字をエスケープし、接続の現在の文字セットを考慮するため、mysql_query() で安全に使用できます。
ヒントとメモ
ヒント: この機能を使用すると、データベース攻撃を防ぐことができます。
例
例 1
//ユーザー名とパスワードのコードを取得します
//SQL で使用するためにユーザー名とパスワードをエスケープします
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND passwd='" . $pwd . "'"
//その他のコード
mysql_close($con);
?>
例 2
データベース攻撃。この例は、mysql_real_escape_string() 関数をユーザー名とパスワードに適用しない場合に何が起こるかを示しています。
$sql = "SELECT * FROM ユーザー
WHERE user='{$_POST['user']}'
AND パスワード='{$_POST['pwd']}'";
mysql_query($sql);
//ユーザー名とパスワードをチェックしません
//ユーザーが入力したものは何でも構いません。例:
$_POST['user'] = 'john';
$_POST['pwd '] = "' OR ''='";
//コード...
mysql_close($con);
?>
SQL クエリは次のようになります。
SELECT * FROM users
WHERE user='john' AND passwd='' OR ''='' これは、有効なパスワードを入力しなくても、どのユーザーでもログインできることを意味します。
例 3
データベース攻撃を防ぐ正しい方法:
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('接続できませんでした: ' .mysql_error()) ;
}
// 安全な SQL を実行します
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = " SELECT * ユーザーから WHERE
user=$user AND パスワード=$pwd";
mysql_query($sql);
mysql_close($con);
?>