簡単な質問...クリーンアップ中のかなりの量のレガシー ASP コードを使用する必要があり、それらはすべて SQL インジェクションに対して脆弱なクエリを使用しています。それらをパラメーター化されたクエリに置き換えるためにまとめたライブラリがありますが、次のアプローチの間にセキュリティの観点から違いがあるかどうか疑問に思っています。
アプローチ 1: これは、パラメーター オブジェクトが個別に構築され、コマンド オブジェクトに追加されるほとんどの例で示されているアプローチです。別の質問の例を次に示します。
アプローチ 2: Command.Execute メソッドをパラメーター値の配列と共に使用します。例:
Command.CommandText = "select foo, bar from baz where a = ? and b = ?"
Command.Execute , Array(1, "BBB")
はい、Execute の最初のパラメーターは無視されます。
最初のアプローチでは、各パラメーターがそのタイプ、サイズなどをすべて指定して構築されており、データベースと一致する必要があります。しかし、すべてが「ちょうど」完璧でない場合、私は常にそのアプローチ、奇妙なエラーなどに問題を抱えていました。したがって、私は後者を好みます。実際、DB ロジックをクラスにカプセル化し、大量の DB 呼び出しでコードを散らかさなくても、必要に応じて配列を渡すことができるため、私のコーディング スタイルでははるかにうまく機能します。
ラッパー DB.Query メソッドを使用したアプローチ #2 の例:
set rs = DB.Query("select foo, bar from baz where a = ? and b = ?", Array(1, "BBB")
または:
set rs = DB.Query("select foo, bar from baz", empty)
(パラメーターが使用されていないことを示すためにキーワードemptyを渡します)
それを考えると、私は疑問に思っています:アプローチ #2 は SQL インジェクション攻撃からまだ安全ですか?
ありがとう。
編集Execute の呼び出しが間違っていて、メモリから書き込まれていましたが、修正されました。