ホームページ > データベース > mysql チュートリアル > 「mysqli_real_escape_string」は SQL インジェクションを防ぐのに十分ですか?

「mysqli_real_escape_string」は SQL インジェクションを防ぐのに十分ですか?

Susan Sarandon
リリース: 2024-12-16 13:15:19
オリジナル
491 人が閲覧しました

Is `mysqli_real_escape_string` Enough to Prevent SQL Injection?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート