如何允许 <source> 标签通过 rails 4 清理?

How can I allow <source> tags through rails 4 sanitize?

我一直在 Rails 4 应用程序中使用 sanitize 方法来清理显示 html 的页面,该页面显示用户生成以防止脚本注入等不安全事件。所以我有一个看起来像这样的视图:

sanitize @user_input

现在,当用户输入带有源标签的视频标签时,我遇到了问题,如下所示:

<video><source src="foo.bar"></video>

不幸的是,sanitize 似乎正在删除源标签,因此视频不再有效。我如何使用 sanitize 以便它允许源标记?另外,我怎样才能得到正在 allowed/dis-allowed 的标签列表?了解引擎盖下发生的事情会很棒。

为了完全清楚,我希望能够将源标记添加到白名单中。当我在 sanitize 的参数中将其指定为允许的标签时,它会删除白名单标签的所有先前默认值。例如,我仍然希望允许使用 a、h1 等默认标签。

如何将源添加到白名单而不是完成替换?

查看 http://apidock.com/rails/ActionView/Helpers/SanitizeHelper/sanitize

您可以像这样提供一个带有您想要列入白名单的标签的选项散列:

sanitize('<video><source src="foo.bar"></video>', tags: %w(video source))

我找不到是否有办法从 Rails 应用程序中获取完整的白名单,但这是使用的默认消毒剂的源代码(查看 WhiteListSanitizer class):

https://github.com/rails/rails-html-sanitizer/blob/master/lib/rails/html/sanitizer.rb

从那里您可以看到允许的标签是:

%w(strong em b i p code pre tt samp kbd var sub
    sup dfn cite big small address hr br div span h1 h2 h3 h4 h5 h6 ul ol li dl dt dd abbr
    acronym a img blockquote del ins)

允许的属性是:

%w(href src width height alt cite datetime title class name xml:lang abbr)

您可以将 videosource 添加到标签列表并将其提供给 sanitize 助手。

你可以这样做:

<%= sanitize @user_input, tags: %w(video source), attributes: %w(src) %>

在深入研究源代码后,我发现允许的默认元素列表是基于 Loofah 的 WhiteList Sanitize

  • 默认标签:Loofah::HTML5::WhiteList::ALLOWED_ELEMENTS_WITH_LIBXML2
  • 默认属性:Loofah::HTML5::WhiteList::ALLOWED_ATTRIBUTES

因此,要将 <source> 添加到默认列表,您可以执行以下操作:

default_tags = Loofah::HTML5::WhiteList::ALLOWED_ELEMENTS_WITH_LIBXML2.add('source')
default_attributes = Loofah::HTML5::WhiteList::ALLOWED_ATTRIBUTES
sanitize @user_input, tags: default_tags, attributes: default_attributes

通过调整默认白名单:

attributes_whitelist = Rails::Html::Sanitizer.white_list_sanitizer.allowed_attributes
attributes_whitelist << 'source'
sanitize(@user_input, attributes: attributes_whitelist)