3

我正在使用 Sanitize gem 来禁止可用于 XSS 攻击的 HTML 代码。作为副作用,HTML 也会被清理。添加缺少的结束标签。这通常没问题,但在许多情况下,它会更改内容的格式。最终,我想完全清理 HTML,但不想将其作为保护站点免受 XSS 攻击的一部分。

那么,缺少结束标签(例如</font>)是否是潜在的 XSS 攻击?如果没有,我如何阻止 Sanitizer 也尝试清理 HTML?

4

2 回答 2

2

Sanitize建立在Nokogiri 之上

因为它基于 Nokogiri,一个成熟的 HTML 解析器,而不是一堆脆弱的正则表达式,所以 Sanitize 可以轻松处理格式错误或恶意格式的 HTML,并且始终输出有效的 HTML 或 XHTML

强调我的。所以答案是“不”,您必须修复损坏的 HTML。

Nokogiri 必须修复 HTML 以便正确解释它并构建 DOM,然后 Sanitize 将修改 Nokogiri 构建的 DOM,最后将序列化修改后的 DOM 以获取您要存储的 HTML。

如果你扫描 Sanitize 源,你会看到一切都结束了clean!,这将使用 Nokogiri 的to_htmlto_xhtml方法:

if @config[:output] == :xhtml
  output_method = fragment.method(:to_xhtml)
  output_method_params[:save_with] = Nokogiri::XML::Node::SaveOptions::AS_XHTML
elsif @config[:output] == :html
  output_method = fragment.method(:to_html)
else
  raise Error, "unsupported output format: #{@config[:output]}"
end

result = output_method.call(output_method_params)

因此,您将获得 Nokogiri 的 HTML 版本,而不仅仅是删除了坏部分的 HTML。

于 2011-08-15T20:30:30.400 回答
0

也许您可以按照文档中的说明配置 sanitize :

默认情况下,Sanitize 会删除所有 HTML。您可以使用其中一种内置配置来告诉 Sanitize 允许某些属性和元素:

Sanitize.clean(html, Sanitize::Config::RESTRICTED)
# => '<b>foo</b>'

Sanitize.clean(html, Sanitize::Config::BASIC)
# => '<b><a href="http://foo.com/" rel="nofollow">foo</a></b>'

Sanitize.clean(html, Sanitize::Config::RELAXED)
# => '<b><a href="http://foo.com/">foo</a></b><img

src="http://foo.com/bar.jpg" />'

或者,如果您想更好地控制允许的内容,您可以提供自己的自定义配置:

Sanitize.clean(html, :elements => ['a', 'span'],
    :attributes => {'a' => ['href', 'title'], 'span' =>

['class']}, :protocols => {'a' => {'href' => ['http', 'https', 'mailto']}})

引用自wonko.com

于 2011-08-15T20:19:35.710 回答