我一直在使用Rails 4应用程序中的sanitize方法来清理显示用户生成的html的页面,以防止脚本注入等不安全的事情。所以我的观点如下:
sanitize @user_input
现在我在使用输入带有源标签的视频标签时遇到问题,如下所示:
<video><source src="foo.bar"></video>
不幸的是,看起来sanitize正在剥离源代码标签,因此视频不再有效。如何使用sanitize以便它允许源标签?另外,我如何获得允许/不允许的标签列表?理解引擎盖下的内容真是太好了。
为了完全清楚,我希望能够将源标记添加到白名单中。当我在清理参数中将其指定为允许标记时,它会删除白名单标记的所有先前默认值。例如,我仍然希望允许默认标签,如a,h1等。
如何将来源添加到白名单而不是完成替换呢?
答案 0 :(得分:2)
在深入挖掘源头后,我发现允许的默认元素列表基于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
答案 1 :(得分: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
帮助程序。
答案 2 :(得分:1)
您可以这样做:
<%= sanitize @user_input, tags: %w(video source), attributes: %w(src) %>
答案 3 :(得分:0)
通过调整默认白名单:
attributes_whitelist = Rails::Html::Sanitizer.white_list_sanitizer.allowed_attributes
attributes_whitelist << 'source'
sanitize(@user_input, attributes: attributes_whitelist)