mysqli_real_escape_string は SQL インジェクションと攻撃を軽減するのに十分ですか?
mysqli_real_escape_string は広く使用されているにもかかわらず、SQL インジェクションに対する完全な防御策ではありません。以下の例に示すように:
$email = mysqli_real_escape_string($db_con, $_POST['email']); $psw = mysqli_real_escape_string($db_con, $_POST['psw']); $query = "INSERT INTO `users` (`email`, `psw`) VALUES ('$email', '$psw')";
このコードは、mysqli_real_escape_string を使用して一重引用符をエスケープすることで、悪意のある入力から保護しようとします。ただし、次の攻撃で示されているように、このアプローチは SQL インジェクションに対して脆弱なままです:
myEmail = 'user@example.com' OR 0 = 1
この例では、インジェクションは、mysqli_real_escape_string が一重引用符のみをエスケープするという事実を悪用します。文字列 myEmail = 'user@example.com' OR 0 = 1 を電子メール フィールドに挿入することにより、攻撃者は認証をバイパスし、不正アクセスを取得できます。
SQL インジェクションを効果的に防止するには、プリペアド ステートメントまたはパラメータ化されたステートメントの利用を検討してください。クエリ。これらのメカニズムはデータと命令を厳密に分離し、入力汚染の可能性を排除します。
プリペアド ステートメントは、ユーザーが指定したパラメーターを使用して問い合わせを実行します。これらの値は、構造を変更することなくクエリに安全に挿入されます。例:
$stmt = $mysqli->prepare("INSERT INTO `users` (`email`, `psw`) VALUES (?, ?)"); $stmt->bind_param("ss", $email, $psw);
準備されたステートメントが実行できない状況では、厳密なホワイトリストを実装して、許可される入力を制限します。これにより、安全な値のみが処理されることが保証されます。
結論として、mysqli_real_escape_string は SQL インジェクションに対してある程度の保護を提供しますが、絶対確実ではありません。準備されたステートメントまたはパラメータ化されたクエリとホワイトリストは、これらの攻撃に対するより堅牢な防御メカニズムを提供します。
以上が「mysqli_real_escape_string」は SQL インジェクションを防ぐのに十分ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。