3

私は、現在 SQL インジェクション保護が欠けているクラシック ASP コードを大量に継承しており、それに取り組んでいます。ここで提供されているソリューションを詳細に調べました:クラシック ASP SQL インジェクション保護 データベース側では、Microsoft SQL サーバー 2000 SP4 を使用しています。

残念ながら、ストアド プロシージャはオプションではありません。

php の mysql_real_escape_string ( http://www.w3schools.com/php/func_mysql_real_escape_string.asp ) を調べた後、その機能を ASP で複製しました。

私の質問は次のとおりです。

1) Microsoft SQL Server 2000 には、MySQL に存在しない、エスケープする必要があるその他の特殊文字 ( \x00 、 \n 、 \r 、 \ 、 ' 、 " 、 \x1a ) がありますか?

2)単一引用符をエスケープし、ユーザー入力を単一引用符で囲むことにより、SQL インジェクションから保護できますか?の回答から 「「引数の引用」手順に対する攻撃を開始する 1 つの方法は、文字列の切り捨てです。MSDN によると、SQL Server 2000 SP4 (および SQL Server 2005 SP1) では、長すぎる文字列は静かに切り捨てられます。」

これを攻撃にどのように使用できますか (そのようなシナリオは本当に想像できません)、それを防ぐ正しい方法は何でしょうか?

3) 他に注意すべき点はありますか? SQLを注入する他の方法はありますか?

注: 30 分間のインターネット検索では、SQL インジェクションから保護する従来の ASP 用のライブラリは存在しないことがわかりました。そうですか、それとも検索という基本的なタスクで本当に失敗したのでしょうか。

4

2 に答える 2

9

最適なオプションは、パラメーター化されたクエリを使用することです。それがどのように行われるかについては、次を確認する必要があります。

PHP でも、PDO (および準備済みステートメント) により、開発者はパラメーター化されたクエリを使用して SQL インジェクションを回避できます。


アップデート

はい、WHERE句でパラメーターを指定できます。そのために、ADODB.Command以下の例のようなオブジェクトを使用できます。

' other connection code
set objCommand = Server.CreateObject("ADODB.Command") 
...

strSql = "SELECT name, info FROM [companies] WHERE name = ?" _ 
    & "AND info = ?;" 
... 
objCommand.Parameters(0).value = strName 
objCommand.Parameters(1).value = strInfo 
...

詳細については、私が上に投稿した記事のリンクを参照してください。または、必要に応じて、トピックについてもう少し調査することもできます。

于 2012-06-13T18:16:25.800 に答える
2

私は 2 層の防御を使用します。

  • 「cleanparameter」関数を作成し、クエリ文字列またはフォーム値から取得するすべての呼び出しで、その関数を呼び出して使用します。この関数は、少なくとも単純な引用符を置き換え、文字列を渡した値に切り詰める必要があります。たとえば、フィールドが 100 文字を超えることができない場合は、x = cleanparameter(request.querystring("x"), 100) のように呼び出します。それが防衛の最前線
  • パラメーター化されたクエリを使用して SQL 命令を実行する
于 2012-06-13T18:19:33.890 に答える