Rails sanitize() 方法有多好?

Posted

技术标签:

【中文标题】Rails sanitize() 方法有多好?【英文标题】:How good is the Rails sanitize() method? 【发布时间】:2011-02-28 11:02:48 【问题描述】:

我可以在我打算向其他用户显示的用户输入文本上使用ActionView::Helpers::SanitizeHelper#sanitize 吗?例如,它会正确处理all cases described on this site吗?

此外,文档中提到:

请注意消毒 用户提供的文字不保证 结果标记是有效的 (符合文件类型)或 甚至形成良好。输出可能仍然 包含例如未转义的 '', '&' 字符和混淆浏览器。

处理此问题的最佳方法是什么?在显示之前通过Hpricot 传递净化后的文本?

【问题讨论】:

【参考方案1】:

Ryan Grove 的 Sanitize 比 Rails 3 sanitize 走得更远。它确保输出 html 格式正确,并具有三个内置白名单:

清理::Config::RESTRICTED 只允许非常简单的内联格式标记。没有链接、图像或块元素。

清理::Config::BASIC 允许各种标记,包括格式化标签、链接和列表。不允许使用图像和表格,链接仅限于 FTP、HTTP、HTTPS 和 mailto 协议,并为所有链接添加属性以减少 SEO 垃圾邮件。

Sanitize::Config::RELAXED 允许比 BASIC 更广泛的标记,包括图像和表格。链接仍然仅限于 FTP、HTTP、HTTPS 和 mailto 协议,而图像仅限于 HTTP 和 HTTPS。在此模式下,不会添加到链接中。

【讨论】:

这是一篇关于 Ryan Grove 的 Sanitize vs the Rails 3 sanitize: devblog.supportbee.com/2011/08/15/sanitizing-css-in-rails 的最新文章【参考方案2】:

Sanitize 肯定比“h”助手好。它实际上允许您指定的 html 标记,而不是转义所有内容。是的,它确实阻止了跨站点脚本,因为它完全从混合中删除了 javascript

简而言之,两者都能完成工作。当您不期望纯文本以外的任何内容时使用“h”,并在您想要允许某些内容时使用 sanitize,或者您认为人们可能会尝试输入它。即使您禁止所有带有 sanitize 的标签,它也会通过删除它们而不是像“h”那样转义它们来“美化”代码。

至于不完整的标签:您可以在通过 hpricot 传递包含 html 的字段的模型上运行验证,但我认为这在大多数应用程序中是多余的。

【讨论】:

大家应该注意到Rails 4正在迁移到Loofah gem进行清理,可以在rails 3中独立使用,到目前为止看起来非常好。【参考方案3】:

最佳行动方案取决于两件事:

您的 rails 版本(2.x 或 3.x) 您的用户是否应该在输入中输入 any html。

一般来说,我不允许我的用户输入 html,而是让他们输入 Textile。

在 Rails 3.x 上:

默认情况下会过滤用户输入。您不必做任何事情,除非您希望您的用户能够发送一些 html。在这种情况下,请继续阅读。

This railscast 处理 Rails 3 上的 XSS 攻击。

在 Rails 2.x 上:

如果您不允许用户使用任何 html,只需使用 h 方法保护您的输出,如下所示:

<%= h post.text %>

如果您希望您的用户发送一些 html:您可以使用 rails 的sanitize 方法或HTML::StathamSanitizer

【讨论】:

不是直接的,但对于随机的谷歌用户(我)来说,这是一个很好的信息,可以更好地理解这个问题 我认为应该添加用户输入是 ~escaped~ 默认情况下,未清理,如果你使用 用户可以输入的任何内容,你应该清理它

以上是关于Rails sanitize() 方法有多好?的主要内容,如果未能解决你的问题,请参考以下文章

用于 ActiveRecord_Relation 的 Rails 未定义方法“sanitize_sql_array”

何时(何时不)运行 `sanitize` 方法?

Ruby on Rails:.html_safe 和 sanitize() 之间的区别

Rails Gem sanitize - 如何加入白名单和

在 Rails 视图中截断 + 清理

如何在Rails 4中清理原始SQL