2012-11-08 140 views
8

我們最近登錄了其他人的代碼,這些代碼已經過DOM XSS攻擊測試並失敗。 基本上網址片段被直接通入jQuery選擇和啓用JavaScript被注入,像這樣:防止DOM XSS

"http://website.com/#%3Cimg%20src=x%20onerror=alert%28/XSSed/%29%3E)" 
$(".selector [thing="+window.location.hash.substr(1)+"]"); 

的問題是,這是在其整個腳本存在的和將需要大量的迴歸測試的至例如固定如果我們將數據轉義出來,如果語句不再返回true,數據將不會匹配。

有問題的JavaScript文件在構建時會連接到很多較小的文件,所以這個問題變得更加難以解決。

有沒有辦法通過一些全局代碼來防止這些DOM XSS攻擊,而無需通過並調試每個實例。


我建議大家在腳本的頂部,以檢測XSS攻擊中常用的字符加少許正則表達式只是要殺死腳本,如果它返回true。

var xss = window.location.href.match(/(javascript|src|onerror|%|<|>)/g); 

if(xss != null) return; 

這似乎工作,但我並不是100%滿意的解決方案。有沒有人有更好的解決方案或任何有用的見解,他們可以提供?

+0

是的,你將需要解決這一切遍及你的文件。 「逃避數據破壞if語句」意味着什麼?爲什麼jQuery選擇器存儲在URL哈希中呢? – Bergi

+0

基本上他們的分頁使用GET參數和URL片段,即使每個加載都是回發。然後他們將這些信息直接用於jQuery而不解析它,並且if(param [0] ==「str」)等等有很多邏輯。爲了避免這種情況,我必須避開這兩個值。 – sidonaldson

+0

是的,你應該使用一個合適的路由器和狀態<->選擇器映射器 – Bergi

回答

6

如果你堅持到正則表達式的解決方案,這是遠遠不夠理想,但可能是最好的選擇給你的約束:

而不是定義一個正則表達式匹配惡意散列(/(javascript|src|onerror|%|<|>)/g),我會定義一個正表達式匹配聲音散列(例如/^[\w_-]*$/)。它會避免假陽性錯誤(例如src_records),明確什麼是授權和什麼不是,並阻止更復雜的注入機制。

+2

所以如此。將其設爲白名單而不是黑名單! – Bergi

+0

我喜歡它。因此,制定一個可接受的字符的白名單,而不是查明某些XSS技術。 – sidonaldson

+0

我已經修改它以匹配搜索和哈希字符串... var urlSearch = window.location.search.match(/^[ - \ w _&?= +] * $ /); var urlHash = window.location.hash.match(/^[ - \ w _&= +#] * $ /); if(urlSearch == null || urlHash == null)return; – sidonaldson

0

你的問題是由於jQuery的輸入字符串可能被視爲HTML,而不僅僅是選擇器。

使用原生document.querySelector()代替jQuery。

如果支持IE7-對您很重要,您可以嘗試Sizzle選擇器引擎,與jQuery和本地querySelector()類似,它不會將輸入字符串解釋爲與選擇器不同的東西。

+0

這不是一個幫助,因爲我試圖避免重寫。 (但從純粹的角度來看,這是正確的) – sidonaldson