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