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