2010-10-28 59 views
3

我想接受來自用戶的html輸入並將其發佈到我的網站上,同時也希望確保它不會因爲html代碼而導致我的網站模板出現問題。html淨化器的替代方案

我以前使用的是HTML淨化器,但Html淨化器不能在我的一臺服務器上工作。所以我正在尋找最佳選擇。 這是純粹用PHP編寫的。 可以解決像

</div> it is dirty code as div is closed without opening. 

回答

4

骯髒的HTML代碼,你可以嘗試PHP Tidy,這是在PHP整潔庫。

+0

我想它應該。查看安裝頁面,它說這個模塊捆綁了PHP> = 5。 – 2010-10-28 23:11:45

+0

謝謝。我正在尋找它 – 2015-06-18 03:41:40

0

我相信Tidy會幫你關閉你的標籤,但它不像HTML Purifier那樣全面,它可以刪除有效但不需要的標籤或屬性(即JavaScript onclick事件,類似的東西)。

請注意,Tidy需要在您的服務器上安裝libtidy,所以它不僅僅是直接的PHP。

我知道帕德里克·布雷迪一直致力於研究替代HTML淨化器Zend框架,但我認爲它只是實驗代碼此時

http://framework.zend.com/wiki/pages/viewpage.action?pageId=25002168

http://github.com/padraic/wibble

+0

我試過了。但它有很多錯誤。 – 2010-10-28 23:25:25

+0

恥辱。我建議要麼嘗試讓HTML Purifier工作,要麼嘗試Tidy。 – simonrjones 2010-10-30 20:34:01

+0

但我想嘗試一下。所以試過了,所以告訴你對此的迴應。 – 2010-11-07 16:59:47

4

簡單的解決方案,而三階第三方庫:創建一個DOMDocument並在您的輸入上調用loadHTML。如果僅解析一小段代碼,則將輸入與<html><body>標記包圍。你可能也想壓制警告,因爲你會讓它們吐出一些常見的不良HTML。

然後簡單地遍歷生成的文檔樹,刪除沒有包含在已知好的列表中的任何元素和屬性。您還應該檢查允許的URL屬性,以確保它們使用已知好的方案,如http:,而不是像javascript:這樣的潛在麻煩方案。如果你想多花一點時間,你可以檢查只有允許的元素組合嵌套在一起(這更容易讓你允許的元素數量更少)。

最後,使用saveHTML再次將片段的節點序列化。因爲您是從DOM創建新的標記,而不是保留原始的可能格式不正確的標記,所以這是您阻止的一類奇怪的標記注入技術。