不存在一個(gè)提及XSS攻擊就都可以應(yīng)付的通法。需要根據(jù)需求思考可能存在的攻擊點(diǎn),做對(duì)應(yīng)的處理。
什么是XSS攻擊
XSS大名叫CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往Web頁面里插入惡意html代碼,當(dāng)用戶瀏覽該頁之時(shí),嵌入其中Web里面的html代碼會(huì)被執(zhí)行,從而達(dá)到惡意用戶的特殊目的。
下面就一個(gè)url傳參的然后在某個(gè)地方展現(xiàn)參數(shù)文本的場(chǎng)景討論
XSS攻擊分類
反射型:后端讀取參數(shù),參數(shù)夾雜在響應(yīng)中。
存儲(chǔ)型:后端讀取參數(shù)、存儲(chǔ),需要拉取數(shù)據(jù)時(shí)返回給前端。
DOM型:前端讀取參數(shù)(路由傳參),參數(shù)插入在DOM結(jié)構(gòu)中。
防御XSS
X-XSS-Protection
一個(gè)瀏覽器用來防御XSS攻擊的HTTP頭字段。
X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<reporting-uri>
0禁止XSS過濾。
1啟用XSS過濾(通常瀏覽器是默認(rèn)的)。 如果檢測(cè)到跨站腳本攻擊,瀏覽器將清除頁面(刪除不安全的部分)。
1; mode=block用XSS過濾。 如果檢測(cè)到攻擊,瀏覽器將不會(huì)清除頁面,而是阻止頁面加載。
1; report=<reporting-uri>啟用XSS過濾。 如果檢測(cè)到跨站腳本攻擊,瀏覽器將清除頁面并使用CSP report-uri指令的功能發(fā)送違規(guī)報(bào)告。
缺點(diǎn):只攔截HTML屬性和節(jié)點(diǎn),瀏覽器支持性不好。
過濾
過濾是面對(duì)XSS的常規(guī)反應(yīng),但是要想好過濾什么。
怎么讓一個(gè)參數(shù)內(nèi)容是代碼的時(shí)候另一邊展示代碼?
字符:> --> > < --> < & ---> &
屬性:on開頭的統(tǒng)統(tǒng)干掉,src href data 要對(duì)url做校驗(yàn)(支持http、https或者相對(duì)路徑,根據(jù)應(yīng)用場(chǎng)景而定),style(因?yàn)槔习姹緸g覽器支持css expression,用戶需要定制樣式可以提供一些定制樣式的class)
標(biāo)簽:script style link embed(嵌入資源,提防flash腳本) object(瀏覽器插件)
可不可以不要一刀切?
對(duì)于css expression可以做一個(gè)CSS過濾器不過會(huì)增加成本,而對(duì)于移動(dòng)端H5的項(xiàng)目可以不用管,因?yàn)閑xpreion已經(jīng)廢棄。
對(duì)于embed object如果不去除還要設(shè)置allowScript為none,等配置。
如何讓用戶輸入的html在另外的地方作為html解析?
很少有這樣的需求,富文本編輯器也是要點(diǎn)擊上方提示樣式按鈕給特定模板語法的。可以通過白名單過濾解決,但是白名單的方案本身很勉強(qiáng)(受限于任知范圍和HTML規(guī)范更新的支持)。
對(duì)于XSS攻擊的處理后端是一定要做的,在前端做會(huì)減輕后端的壓力。后端也是具備解析HTML能力的(通過自己寫的解析器或者開一個(gè)瀏覽器線程),不過對(duì)于后端的意義是不同的,作為一個(gè)XML節(jié)點(diǎn)。