2012-02-02 29 views
4

SQLインジェクションを避けるベストプラクティスは何ですか?私は自分のアプリケーションにMcAfeeの安全チェックを実行しているSQL ServerのブラインドSQLインジェクションの脆弱性を回避するためのベストプラクティス - ASP.Net

、 はそれが問題にSQL Serverの

ブラインドSQLインジェクションの脆弱性を示し、提案は

以下のようにこれを修正するにはSINGLE BEST WAYです各形式の許容可能な入力を確認するための脆弱性があります。 パラメータと基準を満たしていない入力を拒否します。 以下は適切な解決策ですが、最適ではありません。 URLパラメータを含むデータ入力フィールドでコンテンツ解析を実装します。 任意のユーザーまたはダイナミックデータベースの入力から次の文字を削除します。(VBScriptの例) '(一重引用符をエスケープする)input = replace(入力、 "'"、 "''") "(二重引用符)input = replace入力( "("、 ""))(半角かっこ) 入力=置換(入力、 ")"、 "" (パイプ)input = replace(入力、 "|"、 "") - 入力の置換(入力、 ";"、 "" )テキスト入力に ユーザ供給された入力の前後に引用符を追加することをお勧めします。

私が正しく提案を理解していれば、私は自分のアプリケーション内のすべてのフォームを見つけて、" ' () *のような特殊文字を受け付けないためにそれを検証する必要があり

これ以上何かありますか?

どのように私は、SQLインジェクションのための私のアプリケーションが脆弱ではないことを確認することができます

編集


その他の仕様:

Protocol https Port 443 Read Timeout30000Method POST 
Path /Login 
Hea 
ders 
Referer=https%3A%2F%2Fwww.mydomain.org%2FLogin 
Content-Type=application%2Fx-www-form-urlencoded 
Body 
ctl00_ScriptManager1_HiddenField=0 
__EVENTTARGET=0 
__EVENTARGUMENT=0 
__VIEWSTATE=/wEPDwUJNjc2MTk0ODk1D2QWAmYPZBYCAgMPZBYCAgsPZBYCAgUPFgIeBFRleHQ 
FNzxhIGhyZWY9Jy9SZWdpc3RyYXRpb24nIGNsYXNzPSdidXR0b24nPlJlZ2lzdGVyIE5vdzwvYT5kZEMqo 
HfESjF9a2aAo6EwUZFLyVY43k2Ywc5HOrQBdZqz 
__EVENTVALIDATION=/wEWCgLkzYaLDgKV/vKYDgKBuZWrDQKS/tSgCgLJloD/DALrw4jECgKb/IYvAu2 
GxZoEAuemgo8LAoyWmLsKGesm2g0zKeoodCDHz6Mm9GhhkuncAqXhHTAcUjL1R1Y= 
ctl00$header1$btnDisclaimerHTMLOK=OK 
ctl00$header1$btnDisclaimerHTMLCancel=Cancel 
ctl00$header1$btnSubmit=Register 
ctl00$cc1$txtEmail=x' wAiTfOr dELay '0:0:20'-- 
ctl00$cc1$txtPassword=0 
ctl00$cc1$cmdLogin=Log In 
Protocol https Port 443 Read Timeout30000Method POST 
Path /login/ 
Hea 
ders 
Referer=https%3A%2F%2Fwww.mydomain.org%2Flogin%2F 
Content-Type=application%2Fx-www-form-urlencoded 
Body 
ctl00_ScriptManager1_HiddenField=0 
__EVENTTARGET=0 
__EVENTARGUMENT=0 
__VIEWSTATE=/wEPDwUJNjc2MTk0ODk1D2QWAmYPZBYCAgMPZBYCAgsPZBYCAgUPFgIeBFRleHQ 
FNzxhIGhyZWY9Jy9SZWdpc3RyYXRpb24nIGNsYXNzPSdidXR0b24nPlJlZ2lzdGVyIE5vdzwvYT5kZEMqo 
HfESjF9a2aAo6EwUZFLyVY43k2Ywc5HOrQBdZqz 
__EVENTVALIDATION=/wEWCgLkzYaLDgKV/vKYDgKBuZWrDQKS/tSgCgLJloD/DALrw4jECgKb/IYvAu2 
GxZoEAuemgo8LAoyWmLsKGesm2g0zKeoodCDHz6Mm9GhhkuncAqXhHTAcUjL1R1Y= 
ctl00$header1$btnDisclaimerHTMLOK=OK 
ctl00$header1$btnDisclaimerHTMLCancel=Cancel 
ctl00$header1$btnSubmit=Register 
ctl00$cc1$txtEmail=x' wAiTfOr dELay '0:0:20'-- 
ctl00$cc1$txtPassword=0 
ctl00$cc1$cmdLogin=Log In 

私はマカフィーがここで見つける問題が何であるかを理解していません。 ユーザログインのために私はパラメータ化されたストアドプロシージャを使用しています。ユーザー入力はクライアント側で検証されます

+0

マカフィーはかなり間抜けです。誰もが単一の最善の方法がパラメータを使用することを知っています(動的SQLでも、ユーザー入力用のパラメータを使用しています) – dotjoe

答えて

1

これは悪いアドバイスです。それは苦労し、エラーを起こしやすく、回帰失敗に苦しむ可能性があります。最善の方法は、パレートメータ化されたクエリによるデータアクセスのみを許可することです。

の入力に関係なく、あなたはSQLインジェクションに脆弱ではありません。

+0

私は控えめです。これを一時的な保護手段と考えることはできますか?すべてのインラインSQLクエリを検索し、パラメータ化されたプロシージャにするには時間がかかるためです。 – HaBo

+0

いいえ、その方法はあなたの時間を無駄にし、あなたに誤った安全感を与えます。注意:パラメータ化されたクエリのストアドプロシージャを作成する必要はありません。 – RedFilter

+0

うわー。ストアドプロシージャを使用してパラメータ化されたクエリを作成する方法を教えてください – HaBo

0

実際には、Webアプリケーションを介してSQLインジェクション攻撃に敬意を表しないように、はるかに安全かつ監査可能な方法は、Webアプリケーションに動的slqを実行する権限がないことを保証することです。

ストアドプロシージャをセットアップし、そのストアドプロシージャを実行するためのWebサイトの権限のみを与えた場合、ストアドプロシージャが何か不安なことをしない限り、事実上安全であることが保証されます。

5

ベストプラクティスは常にクエリをパラメトリックにすることです。つまり、何かにそれらを変換:

update your_table 
set [email protected], 
colb [email protected] 

あなたが例えばC#の上でこれを行う方法は、次のとおりです。

using (...) 
{ 
    comm = new SqlCommand("update your_table set [email protected], [email protected]",conn); 
    comm.Parameters.AddWithValue("@param1",someValue); 
    comm.Parameters.AddWithValue("@param2",someOtherValue); 
    comm.ExecuteNonQuery(); 
} 
関連する問題