本發(fā)明屬于web安全領(lǐng)域,特別涉及xss攻擊領(lǐng)域。
背景技術(shù):
跨站腳本攻擊,又叫xss攻擊,通常指黑客通過html注入篡改了網(wǎng)頁,插入惡意的腳本,從而在用戶瀏覽網(wǎng)頁時,控制用戶瀏覽器的一種攻擊,是web安全中的頭號大敵,OWASP TOP 10威脅多次把xss列在榜首,xss破壞力強大,且產(chǎn)生的場景復雜,難以一次性解決。
對于web應(yīng)用,用戶通過瀏覽器訪問應(yīng)用的時候,用戶的輸入通過html表單(form)來實現(xiàn),最終用戶所有的輸入以表單(form)的形式發(fā)送到web服務(wù)端,xss攻擊就是發(fā)生在這個時候,黑客利用技術(shù)手段,將惡意腳本,混淆在用戶輸入的表單中,導致xss攻擊。防御xss攻擊,最主要就是對用戶的輸入要進行安全過濾,比如對用戶的輸入過濾掉<script>、alert、iframe等關(guān)鍵字,但黑客通過在上述關(guān)鍵字中間加入空格,即可輕松的避開對script alert iframe的過濾,例如將javascript寫為jav ascript。
在過濾的實現(xiàn)策略上,又有白名單策略和黑名單策略,白名單策略是通過設(shè)置允許用戶輸入的字符或關(guān)鍵字來控制用戶輸入,黑名單策略是通過設(shè)置不允許用戶輸入的字符或關(guān)鍵字來控制用戶輸入。
這些策略在具體實施的時候,存在這樣的缺點:白名單策略,則需要窮舉出所有允許用戶輸入的字符或關(guān)鍵字,只要稍有遺漏,就有可能導致合法的輸入不在白名單中,影響系統(tǒng)功能;黑名單策略,則需要窮舉出所有不允許用戶輸入的字符或關(guān)鍵字,只要稍有遺漏,就有可能導致非法輸入不在黑名單中,引起系統(tǒng)xss攻擊。
綜上所述,不管是采用白名單策略還是黑名單策略,前提都是構(gòu)造一份完整的沒有遺漏的白名單或黑名單,而這在現(xiàn)實中基本上是不太可行,因為隨著系統(tǒng)的不斷升級,新的功能不斷開發(fā),這個白名單,永遠都在不斷增加,同樣黑客技術(shù)也在不斷發(fā)展,今天認為安全的字符或關(guān)鍵字,在明天有可能就是不安全了。
技術(shù)實現(xiàn)要素:
以下給出對一個或更多個方面的簡化概述以力圖提供對此類方面的基本理解。此概述不是所有構(gòu)想到的方面的詳盡綜覽,并且既非旨在指認出所有方面的關(guān)鍵性或決定性要素亦非試圖界定任何或所有方面的范圍。其唯一的目的是要以簡化形式給出一個或更多個方面的一些概念以作為稍后給出的更加具體的說明之序。
本發(fā)明提供一種預(yù)防xss攻擊的方法解決一些情況下xss攻擊的問題。
為實現(xiàn)上述目的,發(fā)明人提供了預(yù)防xss攻擊的方法,包括步驟:
配置xssfilter,使其在過濾函數(shù)中對網(wǎng)頁向目標服務(wù)器發(fā)送的請求的參數(shù)進行過濾,所述進行過濾指判斷請求的參數(shù)中是否包含設(shè)定的關(guān)鍵字,若請求的參數(shù)中出現(xiàn)設(shè)定的關(guān)鍵字,則將其替換為對應(yīng)的設(shè)定字符。
進一步,所述設(shè)定的關(guān)鍵字指ASCII編碼中的指除數(shù)字、大寫字母、小寫字母、美元符號外的所有字符,設(shè)定的關(guān)鍵字所對應(yīng)的字符為其對應(yīng)的全角字符。
進一步,所述的配置xssfilter包括步驟:
在web應(yīng)用的配置文件web.xml中進行配置使xssfilter生效;
通過xssHttpRequestWrapper獲取請求的參數(shù);
并對請求的參數(shù)進行過濾。
進一步,還包含設(shè)置關(guān)鍵字白名單,在對請求的參數(shù)進行過濾時,對關(guān)鍵字白名單中的字符不進行替換處理。
進一步,所述設(shè)定的關(guān)鍵字至少包括以下一個或多個字符:半角左尖括號、半角右尖括號;半角左尖括號、半角右尖括號分別對應(yīng)的設(shè)定字符為全角左尖括號、全角右尖括號。
進一步,所述設(shè)定的關(guān)鍵字至少包括以下一個或多個字符:半角雙豎線和半角等號,半角左尖括號、半角右尖括號分別對應(yīng)的設(shè)定字符為全腳雙豎線和全角等號
進一步,所述設(shè)定的關(guān)鍵字至少包括以下一個或多個字符:半角字符'"/#&;半角'"/#&分別對應(yīng)的設(shè)定字符為全角'"/#&。
上述方法設(shè)置簡單,相比分別在不同的jsp函數(shù)中對用于請求的每個參數(shù)都進行不同的驗證(例如現(xiàn)有技術(shù)中常用的在jsp函數(shù)中對用戶登入的用戶名和密碼的參數(shù)進行是否是全數(shù)值的校驗、或全字母的校驗),本文提供的方法不需要逐一設(shè)置驗證規(guī)則,而可以對網(wǎng)頁發(fā)送的請求的參數(shù)進行過濾,其有效的防御xss攻擊的同時,也降低了工程師的代碼量,有效的縮短了開發(fā)時間和縮短了開發(fā)成本。
相比于通過過濾script等關(guān)鍵字符串,本文通過過濾字符,黑客無法在過濾字符中注入空格等方式規(guī)避,從而有效的避免現(xiàn)有技術(shù)中黑客通過在字符串中加入空格等方式規(guī)避對xss攻擊的過濾的問題。
為能達成前述及相關(guān)目的,這一個或更多個方面包括在下文中充分描述并在所附權(quán)利要求中特別指出的特征。以下描述和附圖詳細闡述了這一個或更多個方面的某些說明性特征。但是,這些特征僅僅是指示了可采用各種方面的原理的各種方式中的若干種,并且本描述旨在涵蓋所有此類方面及其等效方面。
附圖說明
以下將結(jié)合附圖來描述所公開的方面,提供附圖是為了說明而非限定所公開的方面,附圖中相似的標號標示相似要素,并且在其中:
圖1為本文的一種實施方式。
具體實施方式
為詳細說明技術(shù)方案的技術(shù)內(nèi)容、構(gòu)造特征、所實現(xiàn)目的及效果,以下結(jié)合具體實施例并配合附圖1詳予說明。在以下描述中,出于解釋目的闡述了眾多的具體細節(jié)以提供對一個或更多個方面的透徹理解。但是顯而易見的是,沒有這些具體細節(jié)也可實踐此類方面。
可以理解的是xss攻擊產(chǎn)生的場景復雜,且黑客的xss攻擊代碼在不斷進化,本文力求提供在一些場景中的xss攻擊的解決方案,而并非解決所有可能的xss攻擊。
參照圖1,本文提供一種預(yù)防xss攻擊的方法包括步驟:
配置xssfilter,使其在過濾函數(shù)中對網(wǎng)頁向目標服務(wù)器發(fā)送的請求的參數(shù)進行過濾,所述進行過濾指判斷請求的參數(shù)中是否包含設(shè)定的關(guān)鍵字,若請求的參數(shù)中出現(xiàn)設(shè)定的關(guān)鍵字,則將其替換為對應(yīng)的設(shè)定字符。
如果Web應(yīng)用程序接受用戶通過HTTP請求(如GET或POST)提交的輸入信息,然后使用輸出HTML代碼在某些地方顯示這些信息,便可能存在xss漏洞,通過下述實施例說明本文解決上述xss攻擊的方法:
1、Web請求如下所示:
GET http://www.example.com/page.asp?pageid=10&title=Section%20Title
2、在發(fā)出請求后,服務(wù)器返回的HTML內(nèi)容包括:
<h1>Section Title</h1>
3、現(xiàn)在,如果遇到xss攻擊,例如攻擊者通過擺脫<h1>標記來注入代碼:
http://www.example.com/page.asp?pageid=1&title=Section%20Title</h1><script>alert(‘xss%20attack’)</script>
這個請求的HTML輸出將為:
<h1>Section Title</h1><script>alert(‘xss attack’)</script></h1>
參照圖1,例如對于ie瀏覽器,可以通過下述方法實現(xiàn)本發(fā)明的方法:在web.xml中配置打開xssfilter,通過實現(xiàn)一個自定義的HttpServletRequestWrapper,然后在Filter里面調(diào)用它,替換掉getParameter函數(shù)即可將網(wǎng)頁向目標服務(wù)器發(fā)送的請求的參數(shù)進行過濾。本領(lǐng)域技術(shù)人員在了解了針對一個瀏覽器的上述xssfilter設(shè)置方法,其也可以根據(jù)其已掌握的其他瀏覽器的知識,為其他瀏覽器設(shè)置實現(xiàn)上述方法的代碼。
本文中進行過濾指判斷請求的參數(shù)中是否包含設(shè)定的關(guān)鍵字,若請求的參數(shù)中出現(xiàn)設(shè)定的關(guān)鍵字,則其替換為對應(yīng)的設(shè)定字符,即請求中的參數(shù)中
即上述例子中在getParameter函數(shù)中將title對應(yīng)的參數(shù)值Section%20Title</h1><script>alert(‘xss%20attack’)</script>的所有的半角尖括號字符轉(zhuǎn)成全角的尖括號字符,則這個請求的HTML輸出將為:
<h1>Section Title</h1><script>alert(‘xss attack’)</script></h1>,其中下劃線內(nèi)的至少尖括號為全角字符,在另一些替換方式中也可以是將、反斜杠、單引號替換為全角字符。
因此破壞了html標簽原有的語義,瀏覽器不會執(zhí)行<script>alert(‘xss%20attack’)</script>,而是顯示一段普通的文本:Section Title</h1><script>alert(‘xss attack’)</script>,即經(jīng)過半角轉(zhuǎn)全角后,腳本已被破壞,不能在瀏覽器中執(zhí)行,所以xss攻擊失效。
上述方法設(shè)置簡單,相比分別在不同的jsp函數(shù)中對用于請求的每個參數(shù)都進行不同的驗證(例如現(xiàn)有技術(shù)中常用的在jsp函數(shù)中對用戶登入的用戶名和密碼的參數(shù)進行是否是全數(shù)值的校驗、或全字母的校驗),本文提供的方法不需要逐一設(shè)置驗證規(guī)則,而可以對網(wǎng)頁發(fā)送的請求的參數(shù)進行過濾,其有效的防御xss攻擊的同時,也降低了工程師的代碼量,有效的縮短了開發(fā)時間和縮短了開發(fā)成本。
相比于通過過濾script等關(guān)鍵字符串,本文通過過濾字符,黑客無法在過濾字符中注入空格等方式規(guī)避,從而有效的避免現(xiàn)有技術(shù)中黑客通過在字符串中加入空格等方式規(guī)避對xss攻擊的過濾的問題。
優(yōu)選的所述“設(shè)定的關(guān)鍵字”是指ASCII編碼中的指除數(shù)字、大寫字母、小寫字母、美元符號外的所有字符所對應(yīng)的全角字符。
還包含設(shè)置關(guān)鍵字白名單,在對請求的參數(shù)進行過濾時,對關(guān)鍵字白名單中的字符不進行替換處理。即設(shè)定的關(guān)鍵字指ASCII編碼中的指除數(shù)字、大寫字母、小寫字母、美元符號,以及關(guān)鍵字白名單所包含的字符的之外的所有字符。從而便于在系統(tǒng)開發(fā)和維護過程中,根據(jù)具體的xss攻擊的情景或檢測項目的需求,快速的改進過濾效果。
在另一些實施例中所述設(shè)定的關(guān)鍵字至少包括以下一個或多個字符:半角左尖括號、半角右尖括號;半角左尖括號、半角右尖括號分別對應(yīng)的設(shè)定字符為全角左尖括號、全角右尖括號??梢岳斫獾氖侨粼赟ection Title</h1><script>alert(‘xss attack’)</script>中,將半角<替換為全角<也足以影響其在瀏覽器中的解析,從而使其在瀏覽器中不能執(zhí)行。在另一些實施例中,所述設(shè)定的關(guān)鍵字包括以下一個或多個字符:半角雙豎線和半角等號,半角雙豎線和半角等號分別對應(yīng)的設(shè)定字符為全腳雙豎線和全角等號。
以下實施例用于說明本方法:
用戶發(fā)起一個請求如下:
http://127.0.0.1:7001/ams-web/UserServlet?deleteUser&userid=1001
這個請求本意是實現(xiàn)刪除userid為1001的這個用戶。
假設(shè)服務(wù)端實現(xiàn)業(yè)務(wù)邏輯的sql語句是這樣的:sql=”delete t_user where id=”+userid,userid為用戶提交的請求參數(shù)。
黑客只要在請求中針對userid這個請求參數(shù),進行修改如下
http://127.0.0.1:7001/ams-web/UserServlet?deleteUser&userid=1001||1=1
則服務(wù)端執(zhí)行的sql語句變成
“delete t_user where id=1001||1=1”
該語句會刪除所有用戶表中信息。
引入上述安全過濾機制后,上面請求參數(shù)中的userid=1001||1=1,過濾器中會將1001||1=1中的特殊字符,這樣在服務(wù)端拼接的sql語句變成:
“delete t_usre where id=1001||1=1”
這條語句包含了全腳字符,不是一個合法的sql語句,是不能被執(zhí)行的。
從而避免了xss攻擊對服務(wù)器數(shù)據(jù)庫的非法修改。
在另一些實施例中,所述設(shè)定的關(guān)鍵字包括以下一個或多個字符:半角'"/#&;半角'"/#&分別對應(yīng)的設(shè)定字符為全角'"/#&。
需要說明的是,在本文中,諸如術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者終端設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者終端設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括……”或“包含……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者終端設(shè)備中還存在另外的要素。此外,在本文中,“大于”、“小于”、“超過”等理解為不包括本數(shù);“以上”、“以下”、“以內(nèi)”等理解為包括本數(shù)。
上述各實施例是參照根據(jù)實施例所述的方法、設(shè)備(系統(tǒng))、和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機程序指令到計算機設(shè)備的處理器以產(chǎn)生一個機器,使得通過計算機設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導計算機設(shè)備以特定方式工作的計算機設(shè)備可讀存儲器中,使得存儲在該計算機設(shè)備可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機設(shè)備上,使得在計算機設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
盡管已經(jīng)對上述各實施例進行了描述,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例做出另外的變更和修改,所以以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利保護范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運用在其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護范圍之內(nèi)。