2009-02-01 89 views
5

現在我遇到了一些愚蠢的情況。我希望用戶能夠使用紡織品,但他們不應該在他們的入口處亂用我的有效HTML。所以我必須以某種方式逃避HTML。如何紡織和消毒html?

  • html_escape(textilize("</body>Foo"))將打破紡織品而

  • textilize(html_escape("</body>Foo"))會的工作,但打破各種紡織品的功能,如鏈接(這樣寫"Linkname":http://www.wheretogo.com/),因爲該報價將被轉化爲&quot;,因此不會通過紡織了檢測。

  • sanitize沒有做得更好。

對此有何建議?我不希望使用Tidy解決此問題。 在此先感謝。

回答

7

對於遇到同樣問題的人:如果您使用RedCloth寶石您可以定義自己的方法(在您的助手之一中)。從文檔

 
def safe_textilize(s) 
    if s && s.respond_to?(:to_s) 
    doc = RedCloth.new(s.to_s) 
    doc.filter_html = true 
    doc.to_html 
    end 
end 

摘錄:

存取器設置安全限制。

如果您在使用RedCloth格式化 公共場所(例如Wiki)時不希望用戶濫用HTML來處理不好的事情,這是件好事。

如果設置了filter_html,則紡織品處理器未創建的HTML將爲 轉義。或者,如果設置了sanitize_html,則HTML可以通過Textile 處理器,但未經授權的標記和屬性將被刪除。

0

看起來像紡織根本不支持你想要的東西。

你真的只想允許一個精心控制的HTML子集,但是textile的設計允許任意的HTML。我不認爲你可以在這種情況下使用紡織品(除非它支持這種限制)。

你需要的可能是一個特殊的「限制」版紡織品,它只允許「安全」標記(定義,但可能已經很棘手)。但是,我不知道這是否存在。

您可能會看看BBCode,它允許限制可能的標記。

+0

有還有Markdown(Stack Overflow使用),http://daringfireball.net/projects/markdown/ – 2009-02-02 00:39:41

+0

是的,也考慮過降價。但AFAIK的stackoverflow做額外的轉義(傑夫的一些博客帖子指出)。 Markdown還允許任意的HTML。 – 2009-02-02 13:23:20

2

這對我的作品和警衛對每一個XSS攻擊我試着包括onmouse ......前期和代碼塊處理程序:

<%= RedCloth.new(sanitize(@comment.body), [:filter_html, :filter_styles, :filter_classes, :filter_ids]).to_html -%> 

最初的sanitize消除很多潛在的XSS的功勳,包括鼠標懸停。

據我所知:filter_html轉義大多數html代碼,除了代碼和pre。其他過濾器在那裏,因爲我不希望用戶應用任何類,ID和樣式。

我剛剛測試了我的評論頁面,你的榜樣

"</body>Foo" 

,並徹底清除流氓body標籤

我使用Redcloth版本4.2.3和Rails 2.3.5版