攻擊者可以利用XSS漏洞向用戶發(fā)送攻擊腳本,而用戶的瀏覽器因為沒有辦法知道這段腳本是不可信的,所以依然會執(zhí)行它。對于瀏覽器而言,它認為這段腳本是來自可以信任的服務(wù)器的,所以腳本可以光明正大地訪問Cookie,或者保存在瀏覽器里被當(dāng)前網(wǎng)站所用的敏感信息,甚至可以知道用戶電腦安裝了哪些軟件。這些腳本還可以改寫HTML頁面,進行釣魚攻擊。
雖然產(chǎn)生XSS漏洞的原因各種各樣,對于漏洞的利用也是花樣百出,但是如果我們遵循本文提到防御原則,我們依然可以做到防止XSS攻擊的發(fā)生。
有人可能會問,防御XSS的核心不就是在輸出不可信數(shù)據(jù)的時候進行編碼,而現(xiàn)如今流行的Web框架(比如Rails)大多都在默認情況下就對不可信數(shù)據(jù)進行了HTML編碼,幫我們做了防御,還用得著我們自己再花時間研究如何防御XSS嗎?答案是肯定的,對于將要放置到HTML頁面body里的不可信數(shù)據(jù),進行HTML編碼已經(jīng)足夠防御XSS攻擊了,甚至將HTML編碼后的數(shù)據(jù)放到HTML標簽(TAG)的屬性(attribute)里也不會產(chǎn)生XSS漏洞(但前提是這些屬性都正確使用了引號),但是,如果你將HTML編碼后的數(shù)據(jù)放到了<SCRIPT>標簽里的任何地方,甚至是HTML標簽的事件處理屬性里(如onmouseover),又或者是放到了CSS、URL里,XSS攻擊依然會發(fā)生,在這種情況下,HTML編碼不起作用了。所以就算你到處使用了HTML編碼,XSS漏洞依然可能存在。下面這幾條規(guī)則就將告訴你,如何在正確的地方使用正確的編碼來消除XSS漏洞。
原則1:不要在頁面中插入任何不可信數(shù)據(jù),除非這些數(shù)已經(jīng)據(jù)根據(jù)下面幾個原則進行了編碼
第一條原則其實是“Secure By Default”原則:不要往HTML頁面中插入任何不可信數(shù)據(jù),除非這些數(shù)據(jù)已經(jīng)根據(jù)下面幾條原則進行了編碼。
之所以有這樣一條原則存在,是因為HTML里有太多的地方容易形成XSS漏洞,而且形成漏洞的原因又有差別,比如有些漏洞發(fā)生在HTML標簽里,有些發(fā)生在HTML標簽的屬性里,還有的發(fā)生在頁面的<Script>里,甚至有些還出現(xiàn)在CSS里,再加上不同的瀏覽器對頁面的解析或多或少有些不同,使得有些漏洞只在特定瀏覽器里才會產(chǎn)生。如果想要通過XSS過濾器(XSS Filter)對不可信數(shù)據(jù)進行轉(zhuǎn)義或替換,那么XSS過濾器的過濾規(guī)則將會變得異常復(fù)雜,難以維護而且會有被繞過的風(fēng)險。
所以實在想不出有什么理由要直接往HTML頁面里插入不可信數(shù)據(jù),就算是有XSS過濾器幫你做過濾,產(chǎn)生XSS漏洞的風(fēng)險還是很高。
1新聞熱點
疑難解答