従来のASP SQLインジェクション保護
-
02-07-2019 - |
質問
従来のASPアプリのSQLインジェクションから保護する強力な方法は何ですか?
FYIアクセスDBで使用しています。 (私はアプリを書きませんでした)
解決
ストアドプロシージャおよび/または準備されたステートメント:
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を好むので、そもそもアプリは任意のコードを実行することさえ許可されていません。
さらに、コマンドやパラメーターを使用しない場合、ストアドプロシージャの実行ポイントが脆弱になる可能性があります。これは動的に構築され、インジェクションターゲットになる可能性があるため、依然として脆弱です。
Conn.Execute("EXEC usp_ImOnlySafeIfYouCallMeRight '" + param1 + "', '" + param2 + "'") ;
データベースは自身の境界を守る必要があり、さまざまなログインがテーブル内の INSERT / UPDATE / DELETE
の権限を持っている場合、それらのアプリケーション(または侵害されたアプリケーション)のコードは潜在的な可能性があります問題。ログインにストアドプロシージャを実行する権限しかない場合、これによりファネルが形成され、それを使用して正しい動作をより簡単に確認できます。 (オブジェクトがインターフェースに責任を持ち、すべての内部動作を公開しないオブジェクト指向の概念に似ています。)
他のヒント
ここに、私がずっと前に単純なバージョンと拡張バージョンを作成した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
"古典的なASPアプリのSQLインジェクションを防ぐ強力な方法"すべての入力を容赦なく検証することです。期間。
ストアドプロシージャのみおよび/または異なるデータベースシステムは、必ずしも優れたセキュリティと同等ではありません。
MSは最近、クエリで使用される未検証の入力を探すSQLインジェクション検査ツールを発表しました。それがあなたが探しているものです。
リンクは次のとおりです。 Microsoft Source Code Analyzer for SQL Injectionツールを使用して、ASPコードのSQLインジェクションの脆弱性を見つけることができます
パラメータ化されたクエリを使用して、コマンドオブジェクトを作成し、パラメータに名前と値を割り当てる必要があります。そうする場合、他に何も心配する必要はありません(もちろん、SQLインジェクションを参照してください;))
http://prepared-statement.blogspot.com /2006/02/asp-prepared-statements.html
ストアドプロシージャを信頼しないでください。準備されたステートメントを使用しない場合、ストアドプロシージャも攻撃ベクトルになります。
ストアドプロシージャがオプションではない場合、およびたとえそうであっても、すべての入力を徹底的に検証する
ねえ、それを使用する開発者と同じくらい良いデータベース。
これ以上ではなく、それ以下でもない。
優れた開発者であれば、テキストファイルをデータベースとして使用してeコマースサイトを構築できます。 はい、オラクルのウェブサイトほど良くはありませんが、ホームベースのカスタムジュエリー製造のような中小企業にはうまくいきます。
また、優れた開発者であれば、ASPページでインラインSQLステートメントを使用しないでください。 Accessでも、クエリを作成して使用するオプションがあります。
データ検証付きのストアドプロシージャとhtmlエンコード-は、SQLインジェクション攻撃を防ぐ最良の方法です。
SQLインジェクションツール用のMicrosoftソースコードアナライザーを使用して、SQLインジェクションの脆弱性を見つけることができます。 ASPコード
少なくともSQL Expressへの切り替えは素晴らしいオプションです。物事がより安全になります。パラメーターとストアドプロシージャを使用すると、非常に役立ちますが。また、入力を慎重に検証して、期待するものと一致することを確認することをお勧めします。
数値のような値の場合、数値を抽出して、それが実際に単なる数値であることを確認するのはかなり簡単です。 SQLのすべての特殊文字をエスケープします。これを行うと、試行された攻撃が機能しなくなります。