2010-06-06 23 views
14

我可以在我打算向其他用戶展示的用戶輸入文字上使用ActionView::Helpers::SanitizeHelper#sanitize嗎?例如,它會妥善處理all cases described on this siteRails的sanitize()方法有多好?

此外,文件中提到:

請注意消毒 用戶提供的文本並不保證 所產生的標記是有效的 (符合文檔類型)或 甚至良好的。輸出仍然可以包含例如 。未轉義'<','>','&' 字符和混淆瀏覽器。

處理這個問題的最佳方法是什麼?在顯示之前通過Hpricot傳遞已消毒的文本?

回答

4

最好的行動當然取決於兩個因素:

  • 你的Rails版本(x或3 x)
  • 無論你的用戶都應該在進入任何 HTML可言輸入與否。

作爲一般規則,我不允許我的用戶輸入html - 而是讓他們輸入紡織品。

軌道上3.X:

用戶輸入默認情況下消毒。除非您希望用戶能夠發送一些html,否則您不必做任何事情。在這種情況下,請繼續閱讀。

This railscast涉及在軌道3

XSS攻擊on Rails的2.X:

如果不允許從用戶的任何HTML,只是保護你的輸出與h方法,像這樣:

<%= h post.text %> 

如果您想讓您的用戶發送一些HTML:您可以使用Rails的sanitize方法或HTML::StathamSanitizer

+0

這真的沒有回答這個問題。 – Lichtamberg 2010-10-24 11:34:36

+0

@Lichtamberg:爲什麼不呢? – kikito 2010-10-24 17:20:09

+0

不是直接的,但它是一個隨機谷歌加工商(我)更好地瞭解問題的好信息 – brittohalloran 2011-11-22 18:43:29

11

消毒肯定比「h」型助手好。它實際上允許您指定的html標籤,而不是轉義所有內容。是的,它確實可以防止跨站點腳本,因爲它完全從混合中刪除了javascript。

總之,兩者都可以完成工作。如果您不期望明文以外的任何內容,請使用「h」,並在您想允許某些內容時使用清理,或者您認爲人們可能會嘗試輸入內容。即使您不允許所有標籤進行清理,它也會通過刪除它們而不是像「h」一樣將它們轉義出來,從而「代替」代碼。

至於不完整的標籤:您可以運行驗證模型,通過hpricot傳遞包含html的字段,但我認爲這是在大多數應用程序中矯枉過正。

+2

每個人都應該注意到,Rails 4正在轉向絲瓜絡消毒,可以在導軌3中獨立使用,並且迄今爲止看起來非常好。 – MBHNYC 2013-07-24 13:52:45

15

Ryan Grove的Sanitize遠比Rails 3 sanitize更遠。它保證了輸出格式良好的HTML,有三個內置的白名單:

消毒::配置::受限 只允許非常簡單的內嵌格式標記。沒有鏈接,圖像或塊元素。

Sanitize :: Config :: BASIC 允許各種標記,包括格式標記,鏈接和列表。不允許使用圖片和表格,鏈接僅限於FTP,HTTP,HTTPS和mailto協議,並向所有鏈接添加屬性以減輕SEO垃圾郵件。

Sanitize :: Config :: RELAXED允許比BASIC更廣泛的標記,包括圖像和表格。鏈接仍然侷限於FTP,HTTP,HTTPS和mailto協議,而圖像僅限於HTTP和HTTPS。在這種模式下,不會添加到鏈接中。

+2

這是最近一篇關於Ryan Grove的Sanitize vs Rails 3'sanitize'的文章:http://devblog.supportbee.com/2011/08/15/sanitizing-css-in-rails/ – Purplejacket 2011-09-08 21:22:58