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

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

Barbara Streisand
Barbara Streisandオリジナル
2025-01-09 21:32:45243ブラウズ

How Do Parameterized Queries in SQL Prevent SQL Injection Attacks?

疑問符付きの SQL パラメーター化クエリ

SQL ドキュメントを参照すると、クエリ内に疑問符 (?) が表示される場合があります。これらのプレースホルダーはパラメーター化されたクエリを表し、プログラム内で動的 SQL を実行するために広く使用されています。

パラメータ化されたクエリには多くの利点があります。パラメータ値をクエリ自体から切り離すことでコードを簡素化し、クエリをより効率的かつ柔軟にします。さらに、SQL インジェクション攻撃を防止することでセキュリティを強化します。

たとえば、疑似コードの例では次のようになります:

<code>ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = 7")
result = cmd.Execute()</code>

は次のように書き換えることができます:

<code>ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = ?")
cmd.Parameters.Add(7)
result = cmd.Execute()</code>

この手法により、文字列が適切にエスケープされ、SQL インジェクションのリスクが排除されます。次のシナリオを考えてみましょう:

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

ユーザーが文字列 Robert'); を入力すると、SQL インジェクション攻撃が発生する可能性があります。ただし、パラメータ化されたクエリを使用する場合:

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

ライブラリ関数は、悪意のあるコードの実行を防ぐために入力をクリーンアップします。

また、Microsoft SQL Server は名前付きパラメータを使用するため、読みやすさと明瞭さが向上します。

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

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

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