2009-10-06 13 views
7

私は最近、SQLインジェクション攻撃の影響を受けやすいインラインSQLインサートステートメントを数多く使用して、古典的なASP Webサイトを継承しました。従来のASP SQLインジェクション

これらの挿入ステートメントは、ADOコマンドオブジェクト経由で実行されます。

ADOコマンドオブジェクトのPreparedプロパティをtrueに設定すると、実行前にクエリがパラメータ化され、SQLインジェクションのリスクが軽減されますか?

+2

[従来のASP SQLインジェクションプロテクション](http://stackoverflow.com/questions/149848/classic-asp-sql-injection-protection) – NotMe

答えて

6

いいえ、「外側」から直接得られる値を持つSQL文字列を作成すると、「準備済みの文」は役に立ちません。

sSQL = "SELECT * from mytable where mycolumn = '" + querystring("value") + "'" 

はまだトラブルを求めています。 これを解決する唯一の方法は、クエリ内のパラメータを使用することです。

-2

それを介してすべてのリクエスト変数を実行し、ユーザー入力をサニタイズする関数を記述です。私は私を書いたとき、私は次のようなものをした:

  • エスケープ単一引用符、
  • 削除。
  • ステートメントの末尾に - (コメント)できないことを確認してください。

ほとんどのSQLインジェクションは、そのSQLコードは次のようになり' or 1=1 or a=' ような何かをしようとするだろう:

SELECT * from mytable where mycolumn = '' or 1=1 or a='' 

だから、エスケープ単一引用符は、あなたが心配する必要は本当の大きなものです。

+1

多くの人がそのトラップに該当します。関数を作成すると、コードが読みにくくなり、将来の証明にはなりません。私は何年も前に構築した古典的なASPサイトをすべて追跡する方法はなく、使用している機能と使用していない機能を更新するだけではありません。 ADOのパラメータまたはparamterisedストアドプロシージャを使用する方法です。 –

+0

私はパラメータがベストプラクティスであることに同意しますが、たくさんのコードを実際に素早くクリーンアップしようとすると、関数内のすべてのユーザ入力をラップするほうが簡単です。 –

+1

oCmd.ParametersあなたのコードにoCmd.CreateParameter(...)文を追加してください。正直なところこのような状況では、スピードよりも品質に焦点を当てるほうが良いと思います。 –

2

また、 'Owasp stinger'という名前のaspの古典的なオープンソースプロジェクトを見ることもできます。これはSQLインジェクションに役立つだけでなく、ヘッダインジェクションや他のセキュリティ問題もすべてのWebアプリケーションに共通しています。

http://www.owasp.org/index.php/Classic_ASP_Security_Project

+0

+1 for the owasp :) – gmaran23

関連する問題