2008-10-13 82 views
17

我正在尋找執行嚴格(白名單)驗證/篩選用戶提交的HTML的最佳做法。嚴格的HTML驗證和PHP篩選

主要目的是過濾可能通過網頁表單輸入的XSS和類似的垃圾。次要目的是限制由非技術用戶輸入的HTML內容的破壞,例如通過具有HTML視圖的所見即所得編輯器。我正在考慮使用HTML Purifier,或者通過使用HTML DOM解析器來滾動我自己的過程,如HTML(dirty) - > DOM(dirty) - > filter-> DOM(clean) - > HTML(清潔)。

你能用這些或更簡單的策略來描述成功嗎?任何需要注意的缺陷?

回答

9

我已經測試了我在HTML淨化器上知道的所有漏洞,並且做得非常好。它不僅過濾HTML,還過濾CSS和URL。

一旦窄元素和屬性無辜的,陷阱是在屬性內容 - javascript:僞網址(IE允許製表符在協議名稱 - java	script:仍然有效),並觸發JS CSS屬性。

URL的解析可能比較棘手,這些是有效的:http://spoof.com:[email protected]//evil.com。 國際化域(IDN)可以用兩種方式編寫 - Unicode和punycode。

去與HTML淨化器 - 它有這些大部分解決。如果您只是想修復損壞的HTML,請使用HTML Tidy(它以PHP擴展名的形式提供)。

5

用戶提交的HTML並不總是有效的,或者確實是完整的。瀏覽器將解釋各種無效的HTML,你應該確保你可以捕獲它。

另外要注意的有效的前瞻性:

<img src="http://www.mysite.com/logout" /> 

<a href="javascript:alert('xss hole');">click</a> 
+0

感謝羅斯,這些都是應該被濾除的各種輸入的優秀例子。但我正在尋找的答案將包括方法和解決方案。 – 2008-10-14 14:52:02

+0

第一個示例(它是對編碼錯誤文章的引用:http://www.codinghorror.com/blog/archives/001171.html)並不真正相關,因爲'漏洞'取決於該URL的性質,而是比這個特定的HTML代碼片段的語法要複雜得多。 – 2008-10-14 15:26:38

+0

還有一些有用的規則可應用於第一個規則,例如「僅當src屬性與正則表達式/^http:\/\/localsite.com\/uploaded_images\/[\w-]匹配時才允許標記」 * \(PNG | JPG | GIF)。$ /我」。 – 2008-10-14 16:21:15

-1

W3C有在這裏驗證提供HTML一個大的開源軟件包:

http://validator.w3.org/

你可以下載你自己的軟件包,並可能實現無論他們在做什麼。不幸的是,似乎很多DOM解析器似乎都願意彎曲規則,以便像「瘋狂」地分配HTML代碼,所以最好讓主人告訴你什麼是錯誤的,而不是讓它一個更實用的工具 - 有很多網站在那裏不是完美,兼容的HTML,但我們仍然每天都在使用。

1

我用成功的HTML淨化器,並沒有任何xss或其他不需要的輸入過濾器。我還通過Tidy擴展運行消毒HTML,以確保它也被驗證。