ホームページ >データベース >mysql チュートリアル >疑問符を含むパラメータ化されたクエリは SQL インジェクション攻撃をどのように防ぐのでしょうか?

疑問符を含むパラメータ化されたクエリは SQL インジェクション攻撃をどのように防ぐのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-09 21:21:43498ブラウズ

How Do Parameterized Queries with Question Marks Prevent SQL Injection Attacks?

パラメータ化されたクエリによる SQL インジェクションの防止: 疑問符アプローチ

SQL の疑問符 (?) で示されるパラメータ化されたクエリは、SQL インジェクションの脆弱性に対する重要な防御手段です。 これらのクエリは、プログラム内で SQL ステートメントを動的に構築および実行する場合に不可欠です。

手動で作成したクエリに対するパラメータ化されたクエリの主な利点は、セキュリティが強化されていることです。 データベース ライブラリはパラメータの挿入を処理し、悪意のあるコードの挿入を防ぐために必要なエスケープ メカニズムを自動的に適用します。 次の脆弱な例を考えてみましょう:

<code class="language-sql">string s = getStudentName();
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')";
cmd.Execute();</code>

ユーザーが入力した場合: Robert'); DROP TABLE students; --

結果のクエリは攻撃を受けやすくなります。

解決策にはパラメータ化されたクエリの使用が含まれます:

<code class="language-sql">s = getStudentName();
cmd.CommandText = "SELECT * FROM students WHERE name = ?";
cmd.Parameters.Add(s);
cmd.Execute();</code>

ライブラリは入力をサニタイズし、悪意のあるコードを無害にします。クエリは事実上 "SELECT * FROM students WHERE name = 'Robert''); DROP TABLE students; --'" になります。挿入されたコードはリテラル テキストとして扱われます。

疑問符は広く使用されているプレースホルダーですが、MS SQL Server などの他のデータベース システムでは、読みやすさを向上させるために名前付きパラメータ (@varname など) を利用しています。

<code class="language-sql">cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname";
cmd.Parameters.AddWithValue("@varname", 7);
result = cmd.Execute();</code>

このアプローチは、より明確なパラメータ識別により、同じセキュリティ上の利点を提供します。

以上が疑問符を含むパラメータ化されたクエリは SQL インジェクション攻撃をどのように防ぐのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。