2010-05-24 162 views
6

我正在使用javascript所見即所得編輯器處理來自公衆的用戶輸入,並計劃使用htmlpurifier清理文本。使用htmlpurifier進行輸入或輸出轉義/過濾

我認爲在輸入上使用htmlpurifier就足夠了,將清理過的輸入存儲在數據庫中,然後在不進一步轉義/過濾的情況下輸出。但我聽到其他意見,你應該總是逃避輸出。

有人可以解釋爲什麼我應該需要清理輸出,如果我已經清理輸入?

回答

4

我假設您的所見即所得編輯器生成HTML,然後驗證並放入數據庫。在這種情況下,驗證已經發生,因此不需要驗證兩次。

至於「逃避輸出」,這是另一回事。你不能逃避生成的HTML,否則你將不會有格式化的文本,並且標籤將是可見的。當您不希望所述輸出干擾頁面的標記時,使用轉義輸出。

我想補充一點,您必須非常小心您在驗證階段允許的內容。你可能只想要允許一些HTML標籤和屬性。

+0

依賴於js編輯器的問題在於,惡意用戶可能會繞過js所做的任何檢查來提交帖子。 – Yehosef 2010-05-24 14:04:06

+0

@用戶當然。但是,這不是你的淨化器嗎? – 2010-05-24 14:06:41

+0

@Col - 是的 - 但是Artefacto說js「驗證了」html - 所以不需要驗證兩次(意思是使用htmlpurifier) – Yehosef 2010-05-24 14:10:55

1

咒語總是逃避你的輸出,這是一個文本到HTML的轉換,是一個很好的和合理的默認回退到在網絡空間工作時。在HTML Purifier的情況下,你特別打破了這個好建議,因爲你確實正在執行HTML到HTML的轉換,並將HTML視爲Text再次沒有意義。

+0

感謝您的答案,但我沒有完全遵循 - 你是否說過一旦使用htmlpurifier,它可以被視爲安全? – Yehosef 2010-05-24 14:02:48

+1

我認爲這取決於上下文。如果您允許用戶撰寫博客文章,則可以使用HTMLPurifier來決定允許他們使用哪些標籤。完成後,您需要將HTML輸出作爲HTML。您不希望將其視爲轉義的文本,否則如果用戶粗體顯示某個單詞,則會將其轉義並顯示爲單詞。也許愛德華會回來確認我的評論。 – joedevon 2010-11-21 00:39:13

2

爲了100%安全起見,請使用HTMLPurifier兩次。將HTML保存到數據庫之前以及在將其輸出到屏幕之前。
這種解決方案的巨大缺點是性能。在過濾HTML時,HTMLPurifier超慢,您可能會遇到更長的頁面處理時間。

如果您在輸出某些內容之前只執行1-2次篩選,但是如果您對每個請求執行10次篩選,我們寧願在輸出大量文本時不要使用HTMLPurifier。

HTMLPurifier每個請求處理時間花費了60%,我們希望實現低響應時間和更高UX。

這取決於你的情況。如果你在輸出之前可以使用HTMLPurifier,那就去做吧 - 這會更好,而且你總是可以控制你想要允許的標籤(對於新的甚至是存儲在你的數據庫中的舊內容)。

+1

感謝您的發佈 - 但是您能否解釋一個案例,我需要這樣做兩次? 例如,如果我這樣做: $ id =(int)$ _ POST ['id']; $ db-> query(「select * from users where id =」.int_val($ id)); 我在安全方面獲得了什麼? – Yehosef 2010-05-24 14:15:16

+1

第二次過濾(在輸出之前)對於有人侵入您的數據庫服務器但未設法破解您的Web服務器的情況有幫助。攻擊者可以輕鬆更改數據庫中的任何內容,並且如果您在輸出前未過濾HTML,則會出現嚴重的安全問題。不過,我相信這是非常罕見的情況。 – 2010-05-24 14:25:44

+1

這是ridiculuos場景我會說 – 2010-05-24 14:33:32