Rails 4:使用内置 HTML 清理时禁用自动 CSS 清理

Posted

技术标签:

【中文标题】Rails 4:使用内置 HTML 清理时禁用自动 CSS 清理【英文标题】:Rails 4: Disable automatic CSS sanitizing when using built-in HTML sanitize 【发布时间】:2014-03-04 14:25:41 【问题描述】:

我正在构建一个具有 html GUI 界面的应用程序,用于在容器 div 内创建、移动和编辑框 (div)。这些框在编辑时被分配内联样式,这些内联样式保存到数据库并在视图中输出:

<%= sanitize raw(@slide.content) %>

我想清理 HTML 本身,以避免有人入侵,例如,脚本标签,通过编辑保存框时发送到服务器的内容来发送它。

Rails 4 有一个辅助方法 sanitize,可通过类 ActionView::Helpers::SanitizeHelper 获得。当我将它与包含恶意&lt;script&gt; 标记的测试content 值一起使用时,脚本会被很好地删除。但是清理内容也会去除样式标签内对于框必要的 CSS 属性,例如 topleftposition 等。

在链接的文档中,声明sanitize 在遇到style 属性时会自动使用函数sanitize_css

sanitize_css(style)

清理一段 CSS 代码。 sanitize 在遇到样式属性时使用。

我确实想要sanitize 的这种行为。如何使用 sanitize_css 禁用清理以清理 HTML,而不清理 CSS?

【问题讨论】:

【参考方案1】:

你可以允许任何你需要的属性和标签,所以 rails 会跳过它们。

sanitize raw(@slide.content), tags: %w(table tr td ul li), attributes: %w(style href title)

谈到 CSS 规则本身,允许附加规则有点困难,但仍有可能。您可以修改 HTML::WhiteListSanitizer 类 (https://github.com/rails/rails/blob/c71c8a962353642ee44b5cc6ed68dc18322eea72/actionpack/lib/action_view/vendor/html-scanner/html/sanitizer.rb)。有几个属性可以提供帮助。

【讨论】:

样式标签在这里不是问题,也许我应该措辞更好。样式标签本身不会被删除,但其中定义的大多数 CSS 属性会被删除。因此,将其添加到允许的 HTML 标记属性中并没有多大帮助。 这里的标签是指实际的标签(例如或),但attribute是标签的属性(例如或)。所以这里的属性应该可以解决问题。 很抱歉,我的用词又混乱了。好吧,假设&lt;a&gt; 是一个标签,&lt;a style="..."&gt; 中的style 是一个HTML 属性,top: 30px 是一个CSS 属性。被删除的是一些属性,而不是HTML 属性。您的命令所做的是允许 style attribute 通过清理程序,但它无助于让 CSS 属性 通过它。 真的很奇怪。这些css属性是如何在你的代码中设置的? 终于,我明白了! :) 我的错,我在想,rails 本身并没有触及 css 代码。我已经探索了一些源代码,看来您唯一能做的就是对 HTML::WhiteListSanitizer 类 (github.com/rails/rails/blob/…) 进行猴子修补。清理时使用了几个属性:) 希望对您有所帮助! 【参考方案2】:

在您的config/application.rb 文件中:

config.action_view.sanitized_allowed_tags = nil
config.action_view.sanitized_allowed_attributes = nil

在此处找到安全列表:loofah html5 safelist

【讨论】:

以上是关于Rails 4:使用内置 HTML 清理时禁用自动 CSS 清理的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4.2 / Devise - 如果禁用cookie,则向用户显示特定消息

如何在Rails 4中清理原始SQL

Rails 4:如何在 Rails 中使用 JQuery 禁用基于复选框值的文本字段

在 Rails 中清理输入 XSS 和 HTML 输入

禁用 Asset Pipeline/Sprockets Rails 4.1

禁用 Rails 4 的 ActiveRecord