【问题标题】:Are there any better alternatives to Sanitize for a Ruby app?对于 Ruby 应用程序,有没有比 Sanitize 更好的替代方案?
【发布时间】:2013-12-18 21:56:59
【问题描述】:

我爱Sanitize。这是一个了不起的实用程序。我唯一遇到的问题是,它需要永远准备一个开发环境,因为它使用Nokogiri,这对编译时间来说是一个痛苦。是否有任何程序可以使用 Nokogiri 执行 Sanitize 的功能(如果只是温和的功能)?这将成倍增加!

【问题讨论】:

  • 为什么不以不同的方式准备 Nokogiri?
  • 因为 Nokogiri 包装了 libxml2,它是 XML 的引用实现,除了你知道...
  • 取消投票,因为这是一个真正的问题,有可能得到很好的答案。蹩脚的答案是使用 REXML 及其 XPath 重写 Sanitize 的核心。可以遍历 HTML,将每个标签名称与白名单进行比较,并杀死不在白名单上的每个标签。这会很慢;如果这成为问题,则安装 VirtualBox,在其上安装 Ubuntu Saucy Salamander,在其上安装 RVM,然后让 Nokogiri 咆哮。
  • 如果我理解正确,您有一个命令行 ruby​​ 脚本来执行清理工作。如果是这样,为什么不将其包装在一个简单的 Sinatra 等服务中并发布您的请求?
  • 如果这是一个严重的痛点,您可以尝试准备一个Vagrant box,其中所有内容都已经为您编译好了。

标签: ruby-on-rails ruby sanitize


【解决方案1】:

Rails 有自己的SanitizeHelper

根据http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html,会

此清理助手将对所有标签进行 html 编码并去除所有未明确允许的属性。

它还会去除带有无效协议的 href/src 标签,例如 javascript: 尤其如此。它尽最大努力对抗黑客可能使用的任何技巧,例如输入 unicode/ascii/hex 值以通过 javascript: 过滤器。查看广泛的测试套件。

你可以在这样的视图中使用它

<%= sanitize @article.body %>

您可以访问该链接以查看更多自定义选项,例如:

自定义使用(只允许提到的标签和属性,没有别的)

<%= sanitize @article.body, tags: %w(table tr td), attributes: %w(id class style) %>

【讨论】:

  • 你能提供一个链接到这个在普通类实例中的一些示例用法吗?我目前对您所说的解释是,使用 SanitizeHelper 的代码行看起来像“SanitizeHelper::sanitize(html, options)”,而不是普通的 Sanitize(在 require 语句之后):“Sanitize.clean(html , 选项)”。
  • @T145 如果在类实例中使用,您的意思是在控制器中使用 sanitize,那么您可以看到这个问题 - stackoverflow.com/questions/3985989/…
  • 非常感谢,这非常有帮助!我继续用ActionController::Base.helpers.sanitize 替换了我所有的Sanitize.clean 方法,现在一切正常!
  • 作为一个快速跟进,如果我不是从控制器调用(例如从 lib 组件),我会使用什么?从控制器外部使用该方法会引发异常。
  • @TI45 您可以包含 Helper,它应该可以工作 - include ActionView::Helpers::SanitizeHelper
猜你喜欢
  • 2023-04-10
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多