2012-02-02 74 views
4

避免SQL注入的最佳做法是什麼?避免SQL Server中的盲注SQL漏洞的最佳做法 - ASP.Net

我已經跑在我的應用程序中的McAfee安全檢查, 這說明一個問題在SQL Server

盲SQL注入漏洞和建議是如下

爲了解決這個問題的最好WAY脆弱性是爲了識別每種形式的可接受輸入 參數和拒絕輸入不符合標準。 以下是可接受的解決方案,但它不是最佳選擇。 在包含URL參數的數據輸入字段上實施內容解析。 從任何用戶或動態數據庫輸入中刪除以下字符:(在VBScript中的示例) '(轉義單引號)input = replace(input,「'」,「''」)「(雙引號)input = replace輸入,「」「」,「」))(右括號) input = replace(input,「)」,「」)((左括號)input = replace(input,「(」,「」); (輸入,「|」,「」) - 替換(輸入,「|」,「」) - (破折號)輸入=替換(輸入,「 - 」,「」)| ) 在文本輸入建議追加各地用戶提供的輸入引號。

如果我理解正確的建議,我一定要找到我的應用程序的所有形式和驗證它不接受像" ' () *任何特殊字符

還有什麼更多呢?

我如何確保我的應用程序不容易受到攻擊的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 2012-02-02 15:17:20

回答

1

這是不好的建議。這是艱苦的,容易出錯的,並可能遭受迴歸失敗。最好的方法是隻允許通過參數化查詢訪問數據。

然後,無論用戶輸入的,你是不是容易受到SQL注入。

+0

我低估了。我可以將此視爲臨時保障嗎?因爲查找所有內聯SQL查詢並使其參數化過程需要一些時間。 – HaBo 2012-02-02 15:16:29

+0

不,這種方法會浪費你的時間,給你一種虛假的安全感。注意:您不需要爲參數化查詢創建存儲過程。 – RedFilter 2012-02-02 15:19:25

+0

哇。你可以請解釋我如何創建一個存儲過程的參數化查詢 – HaBo 2012-02-02 15:23:19

0

實際上,通過您的Web應用程序確保您的SQL注入攻擊不受尊敬的一種更安全可審計的方法是確保您的Web應用程序無權執行任何動態slq。

如果你設置存儲過程,並且只給你的網站執行這些存儲過程的權利,你幾乎可以保證是安全的,當然,你的存儲過程不會做一些有趣的事情。

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(); 
}