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