我正在使用 Sanitize gem 来禁止可用于 XSS 攻击的 HTML 代码。作为副作用,HTML 也会被清理。添加缺少的结束标签。这通常没问题,但在许多情况下,它会更改内容的格式。最终,我想完全清理 HTML,但不想将其作为保护站点免受 XSS 攻击的一部分。
那么,缺少结束标签(例如</font>
)是否是潜在的 XSS 攻击?如果没有,我如何阻止 Sanitizer 也尝试清理 HTML?
我正在使用 Sanitize gem 来禁止可用于 XSS 攻击的 HTML 代码。作为副作用,HTML 也会被清理。添加缺少的结束标签。这通常没问题,但在许多情况下,它会更改内容的格式。最终,我想完全清理 HTML,但不想将其作为保护站点免受 XSS 攻击的一部分。
那么,缺少结束标签(例如</font>
)是否是潜在的 XSS 攻击?如果没有,我如何阻止 Sanitizer 也尝试清理 HTML?
因为它基于 Nokogiri,一个成熟的 HTML 解析器,而不是一堆脆弱的正则表达式,所以 Sanitize 可以轻松处理格式错误或恶意格式的 HTML,并且始终输出有效的 HTML 或 XHTML。
强调我的。所以答案是“不”,您必须修复损坏的 HTML。
Nokogiri 必须修复 HTML 以便正确解释它并构建 DOM,然后 Sanitize 将修改 Nokogiri 构建的 DOM,最后将序列化修改后的 DOM 以获取您要存储的 HTML。
如果你扫描 Sanitize 源,你会看到一切都结束了clean!
,这将使用 Nokogiri 的to_html
或to_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。
也许您可以按照文档中的说明配置 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