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

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

  

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

Rails 4有一个通过ActionView :: Helpers :: SanitizeHelper类提供的辅助方法sanitize 。 当我使用包含恶意标记的测试content值时,脚本会被删除。 但是,对内容进行清理还会删除样式标记内的框架所必需的 CSS属性,例如topleftposition等。

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

sanitize_css(风格)

清理一块CSS代码。 当它遇到样式属性时由sanitize使用。

希望这种sanitize行为。 如何使用sanitize_css禁用清理,以清理HTML,而不是CSS?

您可以允许所需的任何属性和标记,因此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 )。 有几个属性可以提供帮助。