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