![](/img/trans.png)
[英]Is htmlspecalchars in html value attributes enough to prevent xss?
[英]XSS - Which HTML Tags and Attributes can trigger Javascript Events?
我正在嘗試編寫一個安全且輕量級的基於白名單的 HTML 凈化器,它將使用 DOMDocument。 為了避免不必要的復雜性,我願意做出以下妥協:
script
和style
標簽一起被剝離body
標簽的子節點我已經閱讀了很多關於 XSS 攻擊和預防的文章,我希望我不會太天真(如果我是,請告訴我!)假設如果我遵循我上面提到的所有規則,我會免受 XSS 攻擊。
問題是我不確定除了默認的 Javascript 事件屬性之外還有哪些其他標簽和屬性(在任何 [X]HTML 版本和/或瀏覽器版本/實現中)可以觸發 Javascript 事件:
onAbort
onBlur
onChange
onClick
onDblClick
onDragDrop
onError
onFocus
onKeyDown
onKeyPress
onKeyUp
onLoad
onMouseDown
onMouseMove
onMouseOut
onMouseOver
onMouseUp
onMove
onReset
onResize
onSelect
onSubmit
onUnload
是否有任何其他非默認或專有事件屬性可以觸發 Javascript(或 VBScript 等)事件或代碼執行? 我可以想到href
、 style
和action
,例如:
<a href="javascript:alert(document.location);">XSS</a> // or
<b style="width: expression(alert(document.location));">XSS</b> // or
<form action="javascript:alert(document.location);"><input type="submit" /></form>
我可能會刪除 HTML 標簽中的任何style
屬性, action
和href
屬性帶來更大的挑戰,但我認為以下代碼足以確保它們的值是相對或絕對 URL,而不是一些討厭的 Javascript 代碼:
$value = $attribute->value;
if ((strpos($value, ':') !== false) && (preg_match('~^(?:(?:s?f|ht)tps?|mailto):~i', $value) == 0))
{
$node->removeAttributeNode($attribute);
}
所以,我的兩個明顯問題是:
經過大量測試、思考和研究,我提出了以下(相當簡單的)實現,它似乎不受我可以拋出的任何 XSS 攻擊向量的影響。
我非常感謝您的所有寶貴答案,謝謝。
你提到href
和action
作為地方javascript:
URLs 可以出現,但你在一堆其他 URL 加載屬性中缺少src
屬性。
OWASP Java HTMLPolicyBuilder 的第 399 行是白名單 HTML 清理程序中 URL 屬性的定義。
private static final Set<String> URL_ATTRIBUTE_NAMES = ImmutableSet.of( "action", "archive", "background", "cite", "classid", "codebase", "data", "dsync", "formaction", "href", "icon", "longdesc", "manifest", "poster", "profile", "src", "usemap");
HTML5 索引包含屬性類型的摘要。 它沒有提到一些有條件的東西,比如<input type=URL value=...>
但是如果你掃描那個列表來尋找有效的 URL和朋友,你應該對 HTML5 添加的內容有一個很好的了解。 類型為%URI
的HTML 4 屬性集也提供了信息。
您的協議白名單看起來與OWASP sanitizer非常相似。 添加ftp
和sftp
看起來足夠無害。
Caja JS HTML sanitizer使用的Caja JSON 白名單是 HTML 元素和屬性的安全相關架構信息的一個很好的來源。
你打算如何渲染生成的 DOM? 如果您不小心,那么即使您刪除了所有<script>
元素,攻擊者也可能會使用有問題的渲染器來生成瀏覽器解釋為包含<script>
元素的內容。 考慮不包含腳本元素的有效 HTML。
<textarea></textarea><script>alert(1337)</script></textarea>
有問題的渲染器可能會輸出以下內容:
<textarea></textarea><script>alert(1337)</script></textarea>
它確實包含一個腳本元素。
(完全披露:我寫了上面提到的兩種 HTML 消毒劑的大塊。)
Garuda 已經給出了我認為“正確”的答案,而且他的鏈接非常有用,但他一拳把我打敗了!
我給出我的答案只是為了加強。
在這個 html 和 ecmascript 規范中增加功能的時代,避免 html 中的腳本注入和其他此類漏洞變得越來越困難。 隨着每一個新的添加,一個完整的可能注入的世界被引入。 再加上不同的瀏覽器可能對如何實現這些規范有不同的想法,因此您可能會遇到更多可能的漏洞。
看一看html 5引入的向量的簡短列表
最好的解決辦法是選擇你會允許的,而不是你會拒絕的。 更容易說“這些標簽和這些給定標簽的這些屬性是允許的。其他所有東西都將相應地清理或丟棄。”
對我來說,編制一個列表並說“好吧,你去吧:這是你遺漏的所有注入向量的列表。你可以睡得很安穩”,這對我來說是非常不負責任的。 事實上,可能有很多注入向量甚至不為黑帽或白帽所知。 正如 ha.ckers 網站所說,腳本注入實際上只受頭腦的限制。
我想至少回答你的具體問題,所以這里是你的黑名單中一些明顯的遺漏:
img
src
屬性。 我認為重要的是要注意src
是其他元素的有效屬性,可能是有害的。 img
還有dynsrc
和lowsrc
,甚至更多。type
和language
屬性CDATA
。head
,和html
里面的元素body
,最head
-只有元素的內部, body
無論如何,因此這可能幫助不大。frame
s 和iframe
sembed
並且可能是object
和applet
順便說一句,我確定這無關緊要,但是camelCased 屬性是無效的xhtml 並且應該是小寫的。 我確定這不會影響你。
您可能需要查看這 2 個鏈接以獲取更多參考:
http://adamcecc.blogspot.com/2011/01/javascript.html (這僅適用於“過濾”輸入會在頁面上的腳本標簽之間找到自己的情況)
http://ha.ckers.org/xss.html (其中列出了許多特定於瀏覽器的事件觸發器)
出於這個原因,我也使用了 HTML Purifier,正如您所做的那樣,它也結合了所見即所得的編輯器。 我所做的不同之處是使用了一個非常嚴格的白名單,其中包含一些可用的基本標記和屬性,並在需要時擴展它。 這可以防止您受到非常模糊的向量(如上面的第一個鏈接)的攻擊,並且您可以逐個挖掘新需要的標簽/屬性。
只有我的 2 美分..
不要忘記 HTML5 JavaScript 事件處理程序
http://www.w3schools.com/html5/html5_ref_eventattributes.asp
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.