ホームページ >データベース >mysql チュートリアル >疑問符を含むパラメータ化されたクエリは SQL インジェクション攻撃をどのように防ぐのでしょうか?
パラメータ化されたクエリによる 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 サイトの他の関連記事を参照してください。