web-dev-qa-db-ja.com

クラシックASP SQLインジェクション保護

クラシックASPアプリのSQLインジェクションから保護する強力な方法は何ですか?

ちなみにアクセスDBで使用しています。 (私はアプリを書きませんでした)

35
Daniel A. White

ストアドプロシージャおよび/または準備されたステートメント:

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

単一引用符をエスケープして、単一引用符でユーザー入力を囲むことにより、SQLインジェクションから保護できますか?

SQLインジェクションおよびその他の悪意のあるWeb要求のキャッチ

Access DBでもそれは可能ですが、SQLインジェクションについて既に心配している場合は、とにかくAccessを終了する必要があると思います。

Accessの手法へのリンクは次のとおりです。

http://www.asp101.com/samples/storedqueries.asp

注入から通常保護するのはストアドプロシージャ自体ではなく、パラメータ化されており動的ではないことに注意してください。動的コードを構築するSPであっても、特定の方法でパラメーターを使用して動的コードを構築する場合、インジェクションに対して脆弱になる可能性があることを覚えておいてください。全体として、私はSPを好みます。SPは、アプリケーションがデータベースにアクセスするためのインターフェイスレイヤーを形成し、アプリがそもそも任意のコードを実行することさえ許可されないためです。

さらに、コマンドやパラメーターを使用しない場合、ストアドプロシージャの実行ポイントが脆弱になる可能性があります。これは動的に構築され、インジェクションターゲットになる可能性があるため、依然として脆弱です。

Conn.Execute("EXEC usp_ImOnlySafeIfYouCallMeRight '" + param1 + "', '" + param2 + "'") ;

データベースは独自の境界を守る必要があること、およびさまざまなログインがINSERT/UPDATE/DELETE表では、これらのアプリケーション(または侵害されたアプリケーション)のコードが潜在的な問題になる可能性があります。ログインにストアドプロシージャを実行する権限しかない場合は、これにより目標到達プロセスが形成され、正しい動作をより簡単に確認できます。 (OOの概念と同様に、オブジェクトがそれらのインターフェースを担当し、内部のすべての動作を公開しないという概念)

26
Cade Roux

ここに、私がずっと前に単純なバージョンと拡張バージョンにしたsqlinjectスクリプトをいくつか示します。

function SQLInject(strWords) 
dim badChars, newChars, i
badChars = array("select", "drop", ";", "--", "insert", "delete", "xp_") 
newChars = strWords 
for i = 0 to uBound(badChars) 
newChars = replace(newChars, badChars(i), "") 
next 
newChars = newChars 
newChars= replace(newChars, "'", "''")
newChars= replace(newChars, " ", "")
newChars= replace(newChars, "'", "|")
newChars= replace(newChars, "|", "''")
newChars= replace(newChars, "\""", "|")
newChars= replace(newChars, "|", "''")
SQLInject=newChars
end function 


function SQLInject2(strWords)
dim badChars, newChars, tmpChars, regEx, i
badChars = array( _
"select(.*)(from|with|by){1}", "insert(.*)(into|values){1}", "update(.*)set", "delete(.*)(from|with){1}", _
"drop(.*)(from|aggre|role|assem|key|cert|cont|credential|data|endpoint|event|f ulltext|function|index|login|type|schema|procedure|que|remote|role|route|sign| stat|syno|table|trigger|user|view|xml){1}", _
"alter(.*)(application|assem|key|author|cert|credential|data|endpoint|fulltext |function|index|login|type|schema|procedure|que|remote|role|route|serv|table|u ser|view|xml){1}", _
"xp_", "sp_", "restore\s", "grant\s", "revoke\s", _
"dbcc", "dump", "use\s", "set\s", "truncate\s", "backup\s", _
"load\s", "save\s", "shutdown", "cast(.*)\(", "convert(.*)\(", "execute\s", _
"updatetext", "writetext", "reconfigure", _
"/\*", "\*/", ";", "\-\-", "\[", "\]", "char(.*)\(", "nchar(.*)\(") 
newChars = strWords
for i = 0 to uBound(badChars)
Set regEx = New RegExp
regEx.Pattern = badChars(i)
regEx.IgnoreCase = True
regEx.Global = True
newChars = regEx.Replace(newChars, "")
Set regEx = nothing
next
newChars = replace(newChars, "'", "''")
SqlInject2 = newChars
end function
7
Plippie

「古典的なASPアプリのSQLインジェクションから保護する強力な方法」は、すべての入力を容赦なく検証することです。限目。

ストアドプロシージャだけでも、別のデータベースシステムでも、必ずしも優れたセキュリティとは限りません。

MSは最近、クエリで使用されている未検証の入力を探すSQLインジェクション検査ツールを公開しました。それはあなたが探しているべきものです。

ここにリンクがあります: SQLインジェクションツールのMicrosoftソースコードアナライザーを使用して、SQLインジェクションの脆弱性をASP code で見つけることができます

4
AnonJr

パラメーター化されたクエリを使用して、コマンドオブジェクトを作成し、パラメーターに名前と値を割り当てる必要があります。そうする場合、他に何も心配する必要はありません(もちろんSQLインジェクションを参照してください;))

http://prepared-statement.blogspot.com/2006/02/asp-prepared-statements.html

また、ストアドプロシージャを信頼しないでください。準備されたステートメントを使用しない場合、ストアドプロシージャも攻撃ベクトルになる可能性があります。

3
albertein

ストアドプロシージャがオプションではない場合、およびオプションであっても-すべての入力を完全に検証

1
Steven A. Lowe

ねえ、それを使用する開発者と同じくらい良いデータベース。

それ以上、それ以下ではありません。

優れた開発者であれば、テキストファイルをデータベースとして使用してeコマースサイトを構築できます。はい、それはオラクル主導のウェブサイトほど良くありませんが、ホームベースのカスタムジュエリー製造のような中小企業にとってはうまくいきます。

また、優れた開発者であれば、ASPページでインラインSQLステートメントを使用しないでください。Accessでも、クエリを作成して使用するオプションがあります。

データ検証を伴うストアプロシージャとHTMLエンコード-SQLインジェクション攻撃を防ぐための最良の方法です。

1
alexsts

SQLインジェクションツール用のMicrosoftソースコードアナライザー は、ASPコードでSQLインジェクションの脆弱性を見つけるために利用できます

0
BigJump