従来の ASP アプリを SQL インジェクションから保護する強力な方法は何ですか?
参考までに、アクセスDBで使用しています。(私はアプリを書きませんでした)
従来の ASP アプリを SQL インジェクションから保護する強力な方法は何ですか?
参考までに、アクセスDBで使用しています。(私はアプリを書きませんでした)
ストアド プロシージャおよび/または準備済みステートメント:
https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks
単一引用符をエスケープし、ユーザー入力を単一引用符で囲むことにより、SQL インジェクションから保護できますか?
SQL インジェクションやその他の悪意のある Web リクエストの捕捉
Access DBならまだできますが、SQLインジェクションが気になる方はとにかくAccessをやめたほうがいいと思います。
アクセスのテクニックへのリンクは次のとおりです。
http://www.asp101.com/samples/storedqueries.asp
インジェクションから通常保護されるのは、ストアド プロシージャ自体ではなく、パラメータ化されていて動的ではないという事実であることに注意してください。動的コードを構築する SP でさえ、特定の方法でパラメーターを使用して動的コードを構築すると、インジェクションに対して脆弱になる可能性があることに注意してください。全体として、私は SP を好みます。SP は、アプリケーションがデータベースに到達するインターフェイス レイヤーを形成するためです。そのため、そもそもアプリが任意のコードを実行することさえ許可されていません。
さらに、コマンドとパラメーターを使用しない場合、ストアド プロシージャの実行ポイントが脆弱になる可能性があります。たとえば、これは動的に構築され、インジェクション ターゲットになる可能性があるため、依然として脆弱です。
Conn.Execute("EXEC usp_ImOnlySafeIfYouCallMeRight '" + param1 + "', '" + param2 + "'") ;
データベースは独自の境界を防御する必要があることに注意してください。さまざまなログインがINSERT/UPDATE/DELETE
テーブルへの権限を持っている場合、それらのアプリケーション (または侵害されたアプリケーション) のコードが潜在的な問題になる可能性があります。ログインがストアド プロシージャを実行する権限のみを持っている場合、これはファネルを形成し、正しい動作をより簡単に確認できます。(オブジェクトがそのインターフェースを担当し、すべての内部動作を公開しない OO の概念に似ています。)
これは、私がかなり前に単純バージョンと拡張バージョンを作成した 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 インジェクション インスペクション ツールを発表しました。それがあなたが探しているべきものです。
パラメーター化されたクエリを使用して、コマンド オブジェクトを作成し、名前と値をパラメーターに割り当てる必要があります。そうすれば、他に何も心配する必要はありません (もちろん SQL インジェクションを参照してください;))
http://prepared-statement.blogspot.com/2006/02/asp-prepared-statements.html
また、ストアド プロシージャを信用しないでください。プリペアド ステートメントを使用しないと、ストアド プロシージャも攻撃ベクトルになる可能性があります。
ストアド プロシージャがオプションでない場合 (たとえオプションであっても)、すべての入力を徹底的に検証します。
ねえ、それを使用する開発者と同じくらい優れたデータベース。
それ以上でもそれ以下でもありません。
優れた開発者であれば、テキスト ファイルをデータベースとして使用して e コマース サイトを構築できます。はい、オラクル主導のウェブサイトほど良くはありませんが、ホームベースのカスタムジュエリー製造のような小規模ビジネスには十分です.
また、優れた開発者であれば、ASP ページでインライン SQL ステートメントを使用することはありません。Access でも、クエリを作成して使用するオプションがあります。
SQL インジェクション攻撃を防ぐ最善の方法は、データ検証を使用したストア プロシージャと html エンコードです。
Microsoft Source Code Analyzer for SQL Injection ツールを使用して、ASP コードのSQL インジェクションの脆弱性を見つけることができます
少なくとも SQL Express への切り替えは優れたオプションです。それは物事をより安全にします。ただし、パラメーターとストアド プロシージャを使用すると非常に役立ちます。入力を慎重に検証して、期待どおりのものであることを確認することもお勧めします。
数値のような値の場合、数値を抽出してそれが実際に単なる数値であることを確認するのはかなり簡単です。SQL のすべての特殊文字をエスケープします。これを行うと、試みられた攻撃が機能しなくなります。