mysql_real_escape_stringを使用する正しいタイミングはいつですか?
isset(mysql_escape_string($ _ GET ['param']))を使用するときに使用する必要がありますか?
$ foo = mysql_real_escape_string($ _ GET ['bar']);を使用するときに使用する必要があります。
ありがとう
mysql_real_escape_stringを使用する正しいタイミングはいつですか?
isset(mysql_escape_string($ _ GET ['param']))を使用するときに使用する必要がありますか?
$ foo = mysql_real_escape_string($ _ GET ['bar']);を使用するときに使用する必要があります。
ありがとう
文字列リテラルを使用してSQLクエリを作成する場合は、この関数を呼び出す必要があります。
他の場所では呼び出さないでください。
この関数を呼び出すポイントは、のようなSQLを実行できないようにすることですSELECT * FROM Students WHERE Name = 'Robert'); DROP TABLE Students;--'
。邪悪な文字列が完全に文字列として扱われるように
mysql_real_escape_string
、文字をエスケープします。'
SQLインジェクションを防ぐために、mysqlクエリに挿入するデータを信頼できない場合は常に使用する必要があります。たとえば、すべてのユーザーフォームデータ。最初の例では:いいえ。2番目の例:はい、クエリで$foo変数を使用する場合。
データベースクエリ(POST / GETデータ)にデータを挿入するときは常に使用する必要がありますが、データをチェックする必要がある場合は使用しないでください。
クエリで使用するユーザーからの入力がある場合は常に、mysql_real_escape_stringを使用します。
使用方法は次のとおりです。
$user = mysql_real_escape_string('$_GET['user']);
$password = MD5($user.$_GET['password']);
$query = "SELECT * FROM users WHERE user = '$user' AND password = '$password' ";
//the quotes are vital !! ^ ^ or you will not be safe!
動作しないサンプルコードは次のとおりです。
壊れたコード
$user = mysql_real_escape_string('$_GET['user']);
$password = MD5($user.$_GET['password']);
$query = "SELECT * FROM users WHERE user = $user AND password = '$password' ";
この例では、任意のパスワードとを入力してシステムにログインできます
user or (1=1) --
。これにより、クエリは次のようになります。
SELECT * FROM users WHERE user = user or (1=1) -- AND password = '$password
また、パスワードがチェックされないため、すべてのログインが承認されます。
mysql_queryを使用する場合、一度に実行できるSQLステートメントは1つだけなので、次のようになります。
$query = "SELECT * FROM a; DELETE FROM a WHERE (1=1)"
mysql_query($query);
の後にパーツを含めることはできないため、エラーが発生します;
。
ただし、このコードは機能します。
危険
$query = "SELECT * FROM a; DELETE FROM a WHERE (1=1)"
mysqli_query($query);
改善されたmysqli_queryでは、一度に2つ以上のステートメントを実行できるためです。