2011-11-08 37 views
9

現在我們正在使用的寶石的sanitize:https://github.com/rgrove/sanitizeRails的寶石消毒 - 如何白名單

問題是,如果你輸入「hello & world」的sanitize被保存在數據庫爲:

hello & world 

你怎麼能白名單&。我們要清理所有可能的惡意HTML和JS /腳本標記。但我們確定允許&符號。

想法?謝謝

+0

可能是Sanitize.cl ean(html,Sanitize :: Config :: RELAXED) #=>'&' –

+0

感謝但放鬆允許幾乎所有東西。我想白名單,只是不能找出如何 – AnApprentice

+0

@ bilash.saha輕鬆的配置仍然將HTML轉義實體,你張貼的仍然會輸出「你好&世界」 – Unixmonkey

回答

2

Sanitize將始終將輸出到html實體的輸出轉換爲有效的html/xhtml。

我能確定的最佳方式是過濾輸出

Sanitize.clean("hello & world").gsub('&','&') #=> "Hello & world" 
+0

這將解決&字符,但會不能縮放到html引擎使用的所有各種字符將轉換爲實體。試圖跟蹤所有那些也是頭疼的事情。下面的答案是更好的解決方案IMO –

+0

@ShyamHabarakada Rails的內置'sanitize()'和'strip_tags'的問題在於它們不能糾正格式錯誤的標記,因此無法匹配的<<字符可以破壞頁面佈局。 'strip_tags('Strip 「去掉 Unixmonkey

+0

沒錯,關於格式不正確的標記。我們主要是爲了防止HTML進入不應該有HTML的參數而進行清理。通過內置的strip_tags剝離標籤對我們來說工作得很好。聽起來這也是這個問題中的場景。 我同意,如果您想要完全清理,則需要具有適當的DOM引擎的更好的解決方案。但是對於帕拉姆衛生處理來說,國際海事組織似乎有點過分。 –

1

UnixMonkey的答案是什麼,我們終於實現了。

def remove_markup(html_str) 
    marked_up = Sanitize.clean html_str 

    ESCAPE_SEQUENCES.each do |esc_seq, ascii_seq| 
     marked_up = marked_up.gsub('&' + esc_seq + ';', ascii_seq.chr) 
    end 
    marked_up 
    end 

其中ESCAPE_SEQUENCES是我們不希望轉義的字符的數組。

+0

轉義字符代碼見http://www.escapecodes.info/ – tee

0

鐵軌4.2的,#strip_tags不unencode HTML特殊字符

strip_tags("fun & co") 
    => "fun &amp; co" 

否則你會得到如下:

strip_tags("&lt;script&gt;") 
    => "<script>" 

如果你只是想和號我建議過濾輸出像@Unixmonkey建議並保留到&只有

strip_tags("<bold>Hello & World</bold>").gsub(/&amp;/, "&") 
    => "Hello & World"