[摘要] ASP.NET技術(shù)以其強(qiáng)大的功能在動(dòng)態(tài)網(wǎng)頁(yè)設(shè)計(jì)中得到廣泛應(yīng)用。由于ASP.NET本身的缺陷和程序員安全意識(shí)不強(qiáng),使得應(yīng)用ASP.NET技術(shù)的網(wǎng)站存在各種安全問題。本文結(jié)合ASP.NET網(wǎng)站的開發(fā)經(jīng)驗(yàn),討論了基于ASP.NET網(wǎng)站中常見的安全漏洞,并給出了相應(yīng)的防范策略。
[關(guān)鍵詞] ASP.NET攻擊安全防范
一、前言
Web服務(wù)應(yīng)用正在爆炸式增長(zhǎng),越來(lái)越多的應(yīng)用被推出到防火墻之外,安全性脆弱的Web應(yīng)用面臨的風(fēng)險(xiǎn)也有增無(wú)減。同時(shí),為了在緊迫的時(shí)限之前快速完成應(yīng)用開發(fā),開發(fā)者面臨的壓力越來(lái)越大。因此注重編寫代碼時(shí)的安全問題,同時(shí)投入必要的資源,才能為未來(lái)Web的安全應(yīng)用做好準(zhǔn)備。
二、ASP.NET程序設(shè)計(jì)安全性分析
1.信息隱藏設(shè)置
在ASP.NET應(yīng)用中,幾乎所有HTML頁(yè)面的__VIEWSTATE隱藏域中都可以找到有關(guān)應(yīng)用的信息。由于__VIEWSTATE是BASE64編碼的,所以常常被忽略,但攻擊者可以方便地解碼BASE64數(shù)據(jù),從而得到__VIEWSTATE中提供的詳細(xì)資料。
要解決這個(gè)問題,只需設(shè)置EnableViewStatMAC=”true”,啟用__VIEWSTATE數(shù)據(jù)加密功能。然后將machineKey驗(yàn)證類型設(shè)置成3DES,要求ASP.NET用Triple DES對(duì)稱加密算法加密ViewState數(shù)據(jù)。
2.用戶輸入的校驗(yàn)分析
在Web應(yīng)用開發(fā)中,開發(fā)者最大的失誤往往是無(wú)條件的信任用戶輸入、總是通過(guò)瀏覽器和服務(wù)器交互,從而打開了攻擊Web應(yīng)用的大門。
因此,只有嚴(yán)密地驗(yàn)證用戶輸入的合法性,才能有效抵抗入侵者的攻擊。應(yīng)用程序可以用多種方法執(zhí)行驗(yàn)證,例如,在認(rèn)可用戶輸入之前執(zhí)行驗(yàn)證,確保用戶的輸入中只包含合法的字符,并且所有輸入域的內(nèi)容長(zhǎng)度都沒有超過(guò)范圍。必要時(shí)不僅采取強(qiáng)制性的長(zhǎng)度限制策略,而且還可以對(duì)輸入內(nèi)容按照明確定義的特征集執(zhí)行驗(yàn)證。
應(yīng)在所有的需要通過(guò)網(wǎng)絡(luò)輸入的地方進(jìn)行驗(yàn)證,比如文本框和其他表單輸入字段,字符串查詢參數(shù)等。過(guò)濾策略應(yīng)該是只允許正確的輸入,拒絕非法輸入。這是因?yàn)槎x正確的輸入策略比過(guò)濾所有的非法輸入要容易得多。
要驗(yàn)證表單里面的HTML控件輸入字段,在服務(wù)器端代碼中可以使用Regex正則表達(dá)式類型進(jìn)行字符串的驗(yàn)證,ASP.NET中通過(guò)正則表達(dá)式驗(yàn)證控件(RegularExpresionValidator)實(shí)現(xiàn)。
3.跨站攻擊及防范
跨站腳本執(zhí)行是指將惡意的用戶輸入嵌入到應(yīng)答(HTML)頁(yè)面。例如,下面的ASP.NET頁(yè)面雖然簡(jiǎn)單,卻包含著一個(gè)重大的安全缺陷(陰影處代碼存在漏洞)。
<%@ Page Language=“vb” %>
<asp:Label id=“Label1”runat=“server”>標(biāo)簽文字</asp:Label>
<form method=“post”runat=“server”ID=“Form1”>
請(qǐng)?jiān)诖颂庉斎敕答佇畔ⅲ糱r>
<asp:Textbox ID=“feedback”runat=“server”/><br>
<asp:Button id=“cmdSubmit”runat=“server”
Text=“提交!”O(jiān)nClick=“do_feedback”>
</asp:Button>
</form>
<script runat=“server”>
Sub do_feedback(sender As Object, e As System.EventArgs)
Label1.Text=feedback.Text
End Sub
</script>
要糾正本例中的錯(cuò)誤,只要在下面代碼中加入一個(gè)HtmlEncode調(diào)用即可:
Label1.Text=Server.HtmlEncode(feedback.Text)
這樣,應(yīng)答HTML流將包含用戶輸入內(nèi)容的HTML編碼版本,瀏覽器就不會(huì)執(zhí)行用戶輸入的JavaScript代碼,從而保證代碼的安全。同理,如果需要獲取用戶輸入的URL參數(shù),應(yīng)使用HttpUtility.UrlEncode方法對(duì)地址字符串編碼。
HttpUtility.UrlEncode(urlString);
4.SQL注入攻擊及防范
(1)SQL注入攻擊原理。盲目信任用戶輸入是保障Web應(yīng)用安全的第一敵人。用戶輸入的主要來(lái)源是HTML表單中提交的參數(shù),如果不能嚴(yán)格地驗(yàn)證這些參數(shù)的合法性,就有可能危及服務(wù)器的安全。
下面的代碼查詢后臺(tái)SQL Server數(shù)據(jù)庫(kù),假設(shè)user和password變量的值直接取自用戶輸入:
SqlDataAdapter my_query = new SqlDataAdapter(
“SELECT * FROM accounts WHERE acc_user=”+ user +“ AND acc_password=”+ password, the_connection);
從表面上看,這幾行代碼毫無(wú)問題,實(shí)際上卻可能引來(lái)SQL注入式攻擊。攻擊者只要在user輸入域中輸入“OR 1=1”,就可以順利登錄系統(tǒng),或者只要在查詢之后加上適當(dāng)?shù)恼{(diào)用,就可以執(zhí)行任意Shell命令:
‘; EXEC master xp_cmdshell(shell command here)—‘
(2) SQL注入攻擊防范。要防止上述攻擊行為,有以下三種方法。
第一種方法是禁止引號(hào)之類的特殊字符輸入。
第二種方法是限定輸入域的內(nèi)容必須屬于某個(gè)合法字符的集合,例如“[a-zA-Z0-9]*”。
為了避免注入式攻擊請(qǐng)使用SQL的參數(shù)方式。如果使用參數(shù)集合,輸入的內(nèi)容將被當(dāng)作文本值來(lái)對(duì)待,數(shù)據(jù)庫(kù)不會(huì)執(zhí)行包含在其中的代碼。使用參數(shù)集方式可以嚴(yán)格限定輸入的類型和長(zhǎng)度。如果輸入型超出范圍將會(huì)觸發(fā)異常。
第三種方法是使用SQL參數(shù)API,讓編程環(huán)境的底層API來(lái)構(gòu)造查詢。
使用這些API時(shí),開發(fā)者或提供一個(gè)查詢模板,或提供一個(gè)過(guò)程,然后指定一系列的參數(shù)值,由底層API將參數(shù)值嵌入到查詢模板,然后將構(gòu)造出來(lái)的查詢提交給服務(wù)器執(zhí)行。這種辦法確保參數(shù)能夠正確嵌入。例如,系統(tǒng)將對(duì)引號(hào)進(jìn)行轉(zhuǎn)義處理,從根本上杜絕SQL注入攻擊的發(fā)生,同時(shí),在表單中引號(hào)仍是一個(gè)允許輸入的有效字符。
三、基于ASP.NET的網(wǎng)站安全性檢測(cè)
由于客戶需求不斷變化,員工流動(dòng)性強(qiáng),所以對(duì)開發(fā)者開發(fā)健壯、高質(zhì)量的代碼提出更高的要求。雖然對(duì)所有開發(fā)者進(jìn)行代碼安全技術(shù)的培訓(xùn)是必要的,但不可否認(rèn),自動(dòng)檢測(cè)代碼安全漏洞的工具對(duì)安全代碼設(shè)計(jì)也大有裨益。
到目前為止,開發(fā)者常用的工具只能涵蓋功能測(cè)試的特定方面,例如性能測(cè)試,故障點(diǎn)偵查。人工檢查代碼有著許多局限,而且要求開發(fā)者具有豐富的經(jīng)驗(yàn),所以對(duì)于編寫高質(zhì)量的web應(yīng)用來(lái)說(shuō),面向應(yīng)用程序安全的檢測(cè)工具(如Domain、HDSI、CSAI等)是十分關(guān)鍵的。
要迅速提高應(yīng)用的質(zhì)量和安全性,最有效的辦法是給開發(fā)者提供一個(gè)自動(dòng)測(cè)試應(yīng)用的工具。如果在單元測(cè)試期間,工具能夠檢測(cè)出應(yīng)用的安全缺陷,并將修補(bǔ)建議嵌入到代碼之中,開發(fā)者就能立即找出代碼中存在的錯(cuò)誤,這不僅方便了現(xiàn)有錯(cuò)誤的修改,而且也有助于避免將來(lái)再犯同樣的錯(cuò)誤,不斷地提高代碼抗攻擊的能力。
四、結(jié)論
在使用ASP.NET技術(shù)建站時(shí),包括上述安全漏洞在內(nèi)的一些代碼安全問題都可能出現(xiàn),因此需從服務(wù)器、程序員等方面加強(qiáng)安全防范。對(duì)服務(wù)器來(lái)說(shuō),要關(guān)掉所有用不到的網(wǎng)絡(luò)服務(wù),對(duì)提供網(wǎng)絡(luò)服務(wù)的軟件(如Apache、MySQL、iis等)經(jīng)常進(jìn)行更新,并檢查各自的程序日志以及時(shí)發(fā)現(xiàn)入侵現(xiàn)象。對(duì)程序員來(lái)說(shuō),書寫代碼時(shí)要注意嚴(yán)格過(guò)濾用戶的輸入數(shù)據(jù),并經(jīng)常使用工具對(duì)ASP.NET網(wǎng)站進(jìn)行安全檢測(cè)。
參考文獻(xiàn):
[1][美]Mark M. Burnett著良忠譯:拒絕黑客-ASP.NET Web應(yīng)用程序安全性剖析[M].北京:電子工業(yè)出版社, 2005年
[2]張郭軍:企業(yè)信息網(wǎng)絡(luò)系統(tǒng)安全技術(shù)分析. 商場(chǎng)現(xiàn)代化[J]. 2006, 4:35~36
[3]中國(guó)黑客聯(lián)盟, http://www.cnhacker.com
[4]華夏黑客同盟, http://77169.com