2009-09-29 25 views
5

我想知道,並且至今還沒有找到任何答案,如何完成以下操作。Rails - 使用h()轉義HTML並排除特定標記

比方說,我有一個包含以下內容的字符串:

my_string = 「你好,我是一個字符串。」 (在預覽窗口中,我看到這實際上是用BOLD和ITALIC格式化,而不是顯示「strong」和「i」標籤)

現在,我想使用html_escape()或h())方法/函數。 所以我想阻止用戶插入任何JavaScript和/或樣式表,但是,我仍然希望以粗體顯示單詞「Hello」,單詞「string」以斜體顯示。

據我所見,h()方法不會採用任何其他參數,除了文本本身。

有沒有辦法只轉義某些html標籤,而不是所有?像白色或黑色上市標籤?

的東西,這可能是什麼樣子,什麼,我想說的是例子:

H(my_string,:除了=> [:強壯,我])#=>所以基本上,逃生一切,但只留下「強」和「我」標籤,不要逃避這些。

是否有任何方法或方法可以實現此目標?

在此先感謝!

回答

3

排除特定的標籤實際上是很難的問題。特別是script標籤可以插入very many different ways - 檢測它們都非常棘手。

如果有可能,請不要自行實施。

2

您是否考慮過使用RedClothBlueCloth而不是實際允許使用HTML?這些方法提供了相當多的格式化選項併爲您管理解析。

編輯1:我發現this message當瀏覽如何使用RedCloth刪除HTML時,可能會有一些用處。另外,this page向您展示了2.0.5版本如何讓您刪除HTML。似乎無法找到任何新的信息,但forum post發現了一個漏洞。希望它已被固定,因爲這是從2006年,但我似乎無法找到RedCloth手冊或文檔...

+0

RedCloth很棒,但它不會去掉任何html標籤;我可以插入,它不會被轉義。我不確定BlueCloth如何去除HTML;我以前沒有用過它。 – zgchurch 2009-09-30 01:18:21

1

我會第二次刪除HTML標籤的Sanitize。它工作得很好。它會默認刪除所有內容,您可以爲要允許的標籤指定白名單。

0

防止XSS攻擊是嚴重的事情,請遵循hrnt's,並認爲由於瀏覽器模糊不清,可能存在比可能更多的漏洞。儘管html_escape會將事情鎖定得非常緊密,但我認爲使用任何自制的東西來完成這種事情是錯誤的。你只需要更多的眼球和同行評審來保證任何形式的健壯性。

我現在正在評估sanitize vs XssTerminate。我更喜歡xss_terminate方法,因爲它的魯棒性 - 在模型級別的清理將在所有用戶輸入都經過ActiveRecord的普通Rails應用程序中相當可靠,但Nokogiri,特別是Loofah似乎更具性格,更主動地維護並且明確更靈活和Ruby-ish。

更新我剛剛實施ActsAsTextiled的一個分支叫ActsAsSanitiled使用Santize(最近已被更新的方式來使用引入nokogiri),以保證安全性和RedCloth輸出的良好性,都無需任何助手在你的模板中。