周端鋒
(湖南第一師范學(xué)院 網(wǎng)絡(luò)信息中心,湖南 長沙 410205)
在Web系統(tǒng)中,用戶的表單輸入以及URL地址、參數(shù)是web程序與用戶交互的重要方式,web程序通過用戶輸入的信息進行運算操作,但往往有一些惡意用戶輸入一些程序設(shè)計者未曾預(yù)料的信息,其中一些惡意的輸入會給其他瀏覽者或數(shù)據(jù)庫甚至是應(yīng)用程序的安全帶來威脅,因此了解用戶輸入中的不安全因素及對應(yīng)策略對于整個Web系統(tǒng)來說至關(guān)重要。
客戶端驗證是驗證用戶輸入數(shù)據(jù)合法性的常用方式之一,通過客戶端驗證用戶表輸入的數(shù)據(jù)和用戶瀏覽器地址欄輸入的URL參數(shù)等。一般使用JavaScript編寫腳本結(jié)合正則表達(dá)式的驗證規(guī)則去驗證用戶的輸入是否合法。例如在Web系統(tǒng)中驗證用戶輸入的電子郵件格式通常使用如下的驗證方法:
{if(obj.length>0&&!obj.match(/^.+@.+$/))
{alert("EMAIL錯誤!請重新輸入");return false;}}
很多程序設(shè)計者以為在使用了客戶端驗證后,應(yīng)用程序接受的是驗證后的信息,后面在處理這些信息時就可以高枕無憂了。
很顯然,這種客戶端的驗證是瀏覽器進行驗證的,而瀏覽器是完全在用戶的控制之中,如用戶可以禁止瀏覽器執(zhí)行JavaScript等腳本或使用某種特定的瀏覽器,在客戶端的驗證就只是一個擺設(shè)罷了。由此看來用戶的輸入讓用戶自己去控制的瀏覽器去驗證存在很大的安全問題。惡意用戶繞過客戶端驗證的過程如圖1所示。
圖1:輸入經(jīng)過客戶端驗證過程
客戶端驗證存在的問題的解決方案是將所有用戶輸入進行服務(wù)器端的驗證,這樣增加了服務(wù)器的運算工作量,但近幾年服務(wù)器運算的速度突飛猛進,驗證一些用戶輸入對于服務(wù)器的運算速度來說可以忽略不計;Ajax技術(shù)為我們提供了即時輸入的服務(wù)器端驗證的方法,可以為用戶帶來更好的體驗。
跨站腳本攻擊(XSS,Cross-Site Scripting)是 Web系統(tǒng)中常見的攻擊方式之一,XSS是在遠(yuǎn)程Web頁面的HTML代碼中插入具有惡意目的的數(shù)據(jù),當(dāng)瀏覽器下載該頁面時嵌入其中的腳本將被解釋執(zhí)行[1]。XSS將一些惡意信息存放在WEB服務(wù)器中,其它瀏覽此WEB程序的用戶成為最終的攻擊的受害者。
XSS攻擊涉及攻擊者(惡意用戶)、存在漏洞的Web應(yīng)用程序和受害者三個方面。在這三方中,作為載體的Web應(yīng)用程序一般不會受到影響,而實際運行有害代碼的是運行程序的受害者,XSS攻擊可能會竊取受害者的個人信息甚至發(fā)送未經(jīng)用戶授權(quán)的請求。XSS攻擊的一般步驟如圖2所示。
圖2:XSS攻擊的一般步驟
XSS攻擊產(chǎn)生于Web程序和用戶交互過程中,因此防范此類攻擊要Web程序設(shè)計人員對Web程序中對用戶輸入的字符串進行分析處理。
很多Web程序在有戶提交信息時進行特征匹配檢查,采用的特征匹配方法一般會需要對“JavaScript”等關(guān)鍵字進行檢索,如果有相關(guān)關(guān)鍵字就可以認(rèn)定為XSS攻擊,并把敏感關(guān)鍵字轉(zhuǎn)化為其它的字符,這種檢測方法的缺陷顯而易見:惡意用戶可以通過插入字符或完全編碼的方式躲避檢測。
XSS攻擊也是利用了Web頁面的編寫疏忽,可以從Web應(yīng)用程序開發(fā)的角度來設(shè)計XSS對應(yīng)策略。在用戶提交數(shù)據(jù)之前對內(nèi)容進行全面的驗證,包括POST數(shù)據(jù)、HTTP頭、URL參數(shù),并檢查字符串的長度、格式的合法性,合法的字符串可以提交、拒絕其它的字符串;實現(xiàn)Session標(biāo)記(session tokens)、CAPTCHA系統(tǒng)或者HTTP引用頭檢查,以防功能被其它網(wǎng)站所執(zhí)行;確認(rèn)接收的內(nèi)容規(guī)范化,其中有最小的、安全的標(biāo)記(沒有javascript),特別要注意遠(yuǎn)程的引用(包括CSS等),使用HTTP only的 cookie。
SQL注入是一種腳本注入式攻擊,惡意用戶輸入用來影響被執(zhí)行的SQL腳本[2]。SQL注入利用通常使用可以透過防火墻的HTTP服務(wù)的80端口,和HTTP服務(wù)相同端口有隱蔽性極強不易被發(fā)現(xiàn)的特點。只要是利用SQL語法的Web應(yīng)用程序如果未對輸入SQL語句做嚴(yán)格的處理都會存在SQL注入漏洞[3]。惡意用戶通過表單等形式向數(shù)據(jù)庫提交一段較特殊的SQL語句,繞過程序權(quán)限檢測獲取權(quán)限或增刪數(shù)據(jù),對Web程序數(shù)據(jù)形成極大的破壞。
經(jīng)常使用的用戶名和密碼驗證方式中要求用戶輸入有效的用戶名與密碼才能通過驗證,如下面一段代碼使用Asp和VBScript驗證用戶登陸中就存在漏洞,不法者可以使用SQL注入而無需了解用戶密碼。
不法用戶在使用登陸對話框時,在用戶名文本框中輸入admin’or‘1=1再隨意輸入密碼可以實現(xiàn)成功登陸。很顯然,不法用戶使用邏輯運算中的and與or的運算次序以及無論true/false和 true進行or運算后結(jié)果都為true,這就能夠讓rs記錄集中存在他想要的記錄,成功地非法登陸Web系統(tǒng)的后臺。
在數(shù)據(jù)庫中使用存儲過程能夠很好地杜絕SQL注入攻擊,例如在使用用戶登陸驗證中使用如下存儲過程(PL/SQL):
無論用戶輸入什么數(shù)據(jù),數(shù)據(jù)庫使用存儲過程查詢時都把用戶輸入的數(shù)據(jù)看作相關(guān)參數(shù),不存在被注入的安全問題。
但一些微型數(shù)據(jù)庫不支持存儲過程,此時可以使用Web程序中的參數(shù)查詢,在Web程序中指定用戶輸入為特定的參數(shù),可以很好地杜絕SQL注入。如使用如下程序(C#):
在WEB文件夾中的存在一些資源可能被用戶下載到本地電腦中,這種下載嚴(yán)重危害WEB程序及數(shù)據(jù)的安全。如在ASP+Access編寫的WEB程序中,用戶可以下載Access數(shù)據(jù)庫文件,很多程序員使用改變文件名的方式防止用戶下載,但這種做法無法徹底防止下載,使用ODBC數(shù)據(jù)源可以徹底解決數(shù)據(jù)庫文件被下載的安全問題。
Web程序允許用戶上傳圖片和一些常見類型的附件,在這些附件中存在不安全因素,可以對附件進行類型的過濾,如用戶將用戶上傳的文件類型進行了限制。最近發(fā)現(xiàn)的圖片木馬利用微軟IIS的安全漏洞進行攻擊,該漏洞的涉及面非常廣、危害極大。對付這類安全漏洞可以盡快為操作系統(tǒng)打上安全補丁,也可以針對用戶上傳附件然后執(zhí)行附件的方式將用戶上傳附件的目錄不允許執(zhí)行腳本。
在WEB系統(tǒng)中使用URL地址中附加參數(shù),WEB服務(wù)器根據(jù)URL地址和URL參數(shù)找到相應(yīng)的資源并執(zhí)行相關(guān)的操作,通常這些URL地址及參數(shù)直接顯示在瀏覽器的地址欄中,用戶可以看到這些URL并且可以隨意修改。即使經(jīng)過URL重寫后,以“路徑”形式出現(xiàn)的URL參數(shù),實質(zhì)上仍是一種Web攻擊入口點[4]。例如:http://www.abc.com/delete.aspx?id=50,用戶可以很容易地分析出當(dāng)前的操作是刪除id為50的記錄,惡意修改id=50的參數(shù)可能刪除其它內(nèi)容。
很顯然,此時的URL參數(shù)中存在有安全問題,URL加密可以很好地解決此類安全隱患。除了使用URLEncode和URLDecode外,還可以用HMAC消息認(rèn)證機制[5],也自定義可逆加密算法。例如使用C#定義一個自定義可逆加密算法:
使用此加密/解密算算法可以很簡單地實現(xiàn)URL參數(shù)加密。使用用戶自定義加密算法,非法操作用戶修改URL參數(shù)無法正常解密到需要操作的值,可以很好地保護WEB程序及數(shù)據(jù)的安全。
(注:本文系湖南第一師范學(xué)院科研課題資助項目,項目編號:XYS10N08)
[1]王輝,陳曉平,林鄧偉.計算機工程與設(shè)計[J].2004,(8).
[2]SQL Server安全回顧[EB/OL].http://www.microsoft.com/china/ctc/Newsletter/04/ctc2.htm.
[3]陳小兵,張漢煜.SQL注入攻擊及其防范檢測技術(shù)研究[J].計算機工程與應(yīng)用,2007-11.
[4]陸余良,郭浩.Web安全測試中URL參數(shù)重寫檢測框架[J].計算機工程,2010-12.
[5]王紅霞.基于HMAC-SHA1算法的消息認(rèn)證機制[J].山西師范大學(xué)學(xué)報(自然科學(xué)版),2005-03.