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 获得。当我将它与包含恶意<script>
标记的测试content
值一起使用时,脚本会被很好地删除。但是清理内容也会去除样式标签内对于框必要的 CSS 属性,例如 top
、left
、position
等。
在链接的文档中,声明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是标签的属性(例如或)。所以这里的属性应该可以解决问题。 很抱歉,我的用词又混乱了。好吧,假设<a>
是一个标签,<a style="...">
中的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:如何在 Rails 中使用 JQuery 禁用基于复选框值的文本字段