|
■ 解決方案
域驗(yàn)證器是一種讓ASP.NET開發(fā)者對(duì)域的值實(shí)施限制的機(jī)制,例如,限制用戶輸入的域值必須匹配特定的表達(dá)式。
要防止上述攻擊行為得逞,第一種辦法是禁止引號(hào)之類的特殊字符輸入,第二種辦法更嚴(yán)格,即限定輸入域的內(nèi)容必須屬于某個(gè)合法字符的集合,例如“[a-zA-Z0-9]*”。
2.2 篡改參數(shù)之二
◎ 避免驗(yàn)證操作的漏洞
然而,僅僅為每個(gè)輸入域引入驗(yàn)證器還不能防范所有通過(guò)修改參數(shù)實(shí)施的攻擊。在執(zhí)行數(shù)值范圍檢查之時(shí),還要指定正確的數(shù)據(jù)類型。
也就是說(shuō),在使用ASP.NET的范圍檢查控件時(shí),應(yīng)當(dāng)根據(jù)輸入域要求的數(shù)據(jù)類型指定適當(dāng)?shù)腡ype屬性,因?yàn)門ype的默認(rèn)值是String。
■ 風(fēng)險(xiǎn)分析
由于沒(méi)有指定Type屬性值,上面的代碼將假定輸入值的類型是String,因此RangeValidator驗(yàn)證器只能確保字符串由0-9之間的字符開始,“0abcd”也會(huì)被認(rèn)可。
■ 解決方案
要確保輸入值確實(shí)是整數(shù),正確的辦法是將Type屬性指定為Integer:
MaximumValue="9" Type="Integer"
2.3 信息泄漏
◎ 讓隱藏域更加安全
在ASP.NET應(yīng)用中,幾乎所有HTML頁(yè)面的__VIEWSTATE隱藏域中都可以找到有關(guān)應(yīng)用的信息。由于_VIEWSTATE是BASE 64編碼的,所以常常被忽略,但黑客可以方便地解碼BASE 64數(shù)據(jù),用不著花什么力氣就可以得到__VIEWSTATE提供的詳細(xì)資料。
■ 風(fēng)險(xiǎn)分析
默認(rèn)情況下,__VIEWSTATE數(shù)據(jù)將包含:
、 來(lái)自頁(yè)面控件的動(dòng)態(tài)數(shù)據(jù)。
、 開發(fā)者在ViewState中顯式保存的數(shù)據(jù)。
⑶ 上述數(shù)據(jù)的密碼簽字。
■ 解決方案
設(shè)置EnableViewStatMAC="true",啟用__VIEWSTATE數(shù)據(jù)加密功能。然后,將machineKey驗(yàn)證類型設(shè)置成3DES,要求ASP.NET用Triple DES對(duì)稱加密算法加密ViewState數(shù)據(jù)。
2.4 SQL注入式攻擊
◎ 使用SQL參數(shù)API
正如前文“篡改參數(shù)”部分描述的,攻擊者可以在輸入域中插入特殊字符,改變SQL查詢的本意,欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行惡意的查詢。
■ 風(fēng)險(xiǎn)分析
惡意查詢有可能獲取后端數(shù)據(jù)庫(kù)保存的任何信息,例如客戶信用卡號(hào)碼的清單。
■ 解決方案
除了前面介紹的辦法——用程序代碼確保輸入內(nèi)容只包含有效字符,另一種更加健壯的辦法是使用SQL參數(shù)API(例如ADO.NET提供的API),讓編程環(huán)境的底層API(而不是程序員)來(lái)構(gòu)造查詢。
使用這些API時(shí),開發(fā)者或者提供一個(gè)查詢模板,或者提供一個(gè)存儲(chǔ)過(guò)程,然后指定一系列的參數(shù)值,由底層API將參數(shù)值嵌入到查詢模板,然后將構(gòu)造出來(lái)的查詢提交給服務(wù)器查詢。這種辦法的好處是確保參數(shù)能夠正確地嵌入,例如,系統(tǒng)將對(duì)引號(hào)進(jìn)行轉(zhuǎn)義處理,從根本上杜絕SQL注入式攻擊的發(fā)生。同時(shí),在表單中引號(hào)仍是一個(gè)允許輸入的有效字符,這也是使用底層API的一個(gè)優(yōu)點(diǎn)。
按照這種思路修改前文“篡改參數(shù)”部分的例子,結(jié)果如下:
SqlDataAdapter my_query = new SqlDataAdapter("SELECT * FROM accounts
WHERE acc_user= @user AND acc_password=@pass", the_connection);
SqlParameter userParam = my_query.Select_Command.Parameters.Add(
"@user",SqlDb.VarChar,20);
userParam.Value=user;
SqlParameter passwordParam = my_query.Select_Command.Parameters.Add(
"@",SqlDb.VarChar,20);
passwordParam.Value=password;
2.5 跨站腳本執(zhí)行
◎ 對(duì)外發(fā)的數(shù)據(jù)進(jìn)行編碼
跨站腳本執(zhí)行(Cross-site scripting)是指將惡意的用戶輸入嵌入到應(yīng)答(HTML)頁(yè)面。例如,下面的ASP.NET頁(yè)面雖然簡(jiǎn)單,卻包含著一個(gè)重大的安全缺陷:
<%@ Page Language="vb" %>
標(biāo)簽文字
■ 風(fēng)險(xiǎn)分析
攻擊者可以用JavaScript代碼構(gòu)造一個(gè)惡意的查詢,點(diǎn)擊鏈接時(shí)JavaScript就會(huì)運(yùn)行。舉例來(lái)說(shuō),腳本可以通過(guò)下面的用戶輸入來(lái)嵌入:
■ 解決方案
在一個(gè)雙層的安全體系中,對(duì)HTML頁(yè)面中出現(xiàn)的外發(fā)用戶數(shù)據(jù)執(zhí)行輸入驗(yàn)證和HTML編碼,確保瀏覽器只把用戶輸入數(shù)據(jù)當(dāng)成純粹的文本,而不是其他具有特殊含義的內(nèi)容,例如HTML代碼、JavaScript腳本。
對(duì)于本例,只要加入一個(gè)HtmlEncode調(diào)用即可:
Label1.Text=Server.HtmlEncode(feedback.Text)
這樣,應(yīng)答HTML流將包含用戶輸入內(nèi)容的HTML編碼版本,也就是說(shuō),瀏覽器不會(huì)執(zhí)行用戶輸入的JavaScript代碼,因?yàn)楦静淮嬖贖TML的
本新聞共 2頁(yè),當(dāng)前在第 2頁(yè) 1 2 |
|
【收藏】【打印】【進(jìn)入論壇】 |
|
|
|
|
|
|
|