2

簡単な質問...クリーンアップ中のかなりの量のレガシー 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 の呼び出しが間違っていて、メモリから書き込まれていましたが、修正されました。

4

1 に答える 1

2

私から見れば、そうです。

簡単な例を書いて、Visual Studio でデバッグしました。への電話の後、

Command.Execute , Array(1, "BBB")

ADODB.Command の Parameters オブジェクトには、配列から指定された値が適切に入力されます。パラメータのデータ型と長さが正しく設定されています。

したがって、私の意見では、このアプローチはアプローチ #1 (手動で作成された Parameters オブジェクトを使用) と同じくらい安全です。

于 2013-08-23T07:21:04.667 に答える