我正在使用javascript所見即所得編輯器處理來自公衆的用戶輸入,並計劃使用htmlpurifier清理文本。使用htmlpurifier進行輸入或輸出轉義/過濾
我認爲在輸入上使用htmlpurifier就足夠了,將清理過的輸入存儲在數據庫中,然後在不進一步轉義/過濾的情況下輸出。但我聽到其他意見,你應該總是逃避輸出。
有人可以解釋爲什麼我應該需要清理輸出,如果我已經清理輸入?
我正在使用javascript所見即所得編輯器處理來自公衆的用戶輸入,並計劃使用htmlpurifier清理文本。使用htmlpurifier進行輸入或輸出轉義/過濾
我認爲在輸入上使用htmlpurifier就足夠了,將清理過的輸入存儲在數據庫中,然後在不進一步轉義/過濾的情況下輸出。但我聽到其他意見,你應該總是逃避輸出。
有人可以解釋爲什麼我應該需要清理輸出,如果我已經清理輸入?
我假設您的所見即所得編輯器生成HTML,然後驗證並放入數據庫。在這種情況下,驗證已經發生,因此不需要驗證兩次。
至於「逃避輸出」,這是另一回事。你不能逃避生成的HTML,否則你將不會有格式化的文本,並且標籤將是可見的。當您不希望所述輸出干擾頁面的標記時,使用轉義輸出。
我想補充一點,您必須非常小心您在驗證階段允許的內容。你可能只想要允許一些HTML標籤和屬性。
咒語總是逃避你的輸出,這是一個文本到HTML的轉換,是一個很好的和合理的默認回退到在網絡空間工作時。在HTML Purifier的情況下,你特別打破了這個好建議,因爲你確實正在執行HTML到HTML的轉換,並將HTML視爲Text再次沒有意義。
爲了100%安全起見,請使用HTMLPurifier兩次。將HTML保存到數據庫之前以及在將其輸出到屏幕之前。
這種解決方案的巨大缺點是性能。在過濾HTML時,HTMLPurifier超慢,您可能會遇到更長的頁面處理時間。
如果您在輸出某些內容之前只執行1-2次篩選,但是如果您對每個請求執行10次篩選,我們寧願在輸出大量文本時不要使用HTMLPurifier。
HTMLPurifier每個請求處理時間花費了60%,我們希望實現低響應時間和更高UX。
這取決於你的情況。如果你在輸出之前可以使用HTMLPurifier,那就去做吧 - 這會更好,而且你總是可以控制你想要允許的標籤(對於新的甚至是存儲在你的數據庫中的舊內容)。
感謝您的發佈 - 但是您能否解釋一個案例,我需要這樣做兩次? 例如,如果我這樣做: $ id =(int)$ _ POST ['id']; $ db-> query(「select * from users where id =」.int_val($ id)); 我在安全方面獲得了什麼? – Yehosef 2010-05-24 14:15:16
第二次過濾(在輸出之前)對於有人侵入您的數據庫服務器但未設法破解您的Web服務器的情況有幫助。攻擊者可以輕鬆更改數據庫中的任何內容,並且如果您在輸出前未過濾HTML,則會出現嚴重的安全問題。不過,我相信這是非常罕見的情況。 – 2010-05-24 14:25:44
這是ridiculuos場景我會說 – 2010-05-24 14:33:32
依賴於js編輯器的問題在於,惡意用戶可能會繞過js所做的任何檢查來提交帖子。 – Yehosef 2010-05-24 14:04:06
@用戶當然。但是,這不是你的淨化器嗎? – 2010-05-24 14:06:41
@Col - 是的 - 但是Artefacto說js「驗證了」html - 所以不需要驗證兩次(意思是使用htmlpurifier) – Yehosef 2010-05-24 14:10:55