2

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

sanitize @user_input

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

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

不幸的是,sanitize 似乎正在剥离源标签,因此视频不再有效。如何使用 sanitize 以允许源标签?另外,如何获取允许/禁止的标签列表?很高兴了解引擎盖下发生了什么。

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

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

4

4 回答 4

3

在挖掘源代码后,我发现允许的默认元素列表基于 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
于 2016-01-28T23:01:41.147 回答
2

通过调整默认白名单:

attributes_whitelist = Rails::Html::Sanitizer.white_list_sanitizer.allowed_attributes
attributes_whitelist << 'source'
sanitize(@user_input, attributes: attributes_whitelist)
于 2018-10-30T09:58:26.653 回答
1

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

您可以提供带有您想要列入白名单的标签的选项哈希,如下所示:

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

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

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)

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

于 2016-01-28T19:56:21.360 回答
1

你可以这样做:

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

于 2016-01-28T19:57:05.723 回答