8

重複の可能性:
PHP で SQL インジェクションを防止する最善の方法

クエリを作成するときに文字列をエスケープする最良の方法は何ですか? mysql_real_escape_string() は良いようですが、適切に使用する方法が正確にはわかりません。

このコードは適切に機能しますか?

<?php
   /* Let's say that the user types "'#""#''"\{(})#&/\€ in a textfield */
   $newStr = mysql_real_escape_string($str);
   $query = "INSERT INTO table username VALUES ($str)";
   mysql_query($query);
?>

編集:

今、私はこのコードを持っています:

      $email = $_POST['email'];
    $displayName = $_POST['displayName'];
    $pass = $_POST['pass1'];

    $email = mysqli_real_escape_string($link, $email);
    $displayName = mysqli_real_escape_string($link, $displayName);
    $pass = mysqli_real_escape_string($link, $pass);

    $insert = "INSERT INTO profiles (email, displayName, password)
    VALUES ('$email', '$displayName', md5('$pass'))";
    mysqli_query($link, $insert)
    or die(mysqli_error($link));

しかし、次のエラーが表示されます。SQL 構文にエラーがあります。1 行目の ' !"#!#^!"#!" #!"#^''''''付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

ユーザーが入力した場合: '**!"#!#^!"#!"*#!"#^''''

4

2 に答える 2

7

最善の方法は、文字列をまったくエスケープするのではなく、パラメータ化されたクエリを使用することです。これにより、舞台裏でそれが実行されます。

于 2012-07-13T21:35:25.540 に答える
6

そのように使用mysql_real_escape_stringすることは機能しますが、次のことを行う必要があります。

  • 値を引用符で囲みます。
  • $newStr元の値ではなく、結果を使用します$str
  • テーブル名を予約キーワードではない名前に変更してください。
  • 列リストの前後に括弧を追加します。

これを試して:

$query = "INSERT INTO yourtable (username) VALUES ('$newStr')";

mysql_query($query)また、の結果を確認し、エラーが発生した場合は、エラーメッセージを確認することをお勧めします。

if (!mysql_query($query))
{
    trigger_error(mysql_error());
}

MySQLへの新しいインターフェースの1つを使用することも検討する必要があります。古いmysql_*関数は非推奨であり、新しいコードでは使用しないでください。

于 2012-07-13T21:35:28.050 に答える