HTML安全解析指南:Element.setHTML()方法详解

本文详细介绍了Element.setHTML()方法,这是一种XSS安全的HTML解析和清理技术,能够将HTML字符串安全地插入DOM,有效防止跨站脚本攻击,保障Web应用安全。

Element: setHTML() 方法

实验性功能:这是一项实验性技术,在生产环境使用前请仔细检查浏览器兼容性表。

Element 接口的 setHTML() 方法提供了一种XSS安全的方法来解析和清理HTML字符串,将其转换为 DocumentFragment,然后作为元素的子树插入到DOM中。

语法

1
setHTML(input, options)

参数

  • input 定义要清理并注入元素的HTML字符串。

  • options(可选) 包含以下可选参数的对象:

    • sanitizer 一个 SanitizerSanitizerConfig 对象,定义输入中哪些元素将被允许或移除,或者是字符串 “default” 表示使用默认配置。 注意:如果要重复使用配置,通常 SanitizerSanitizerConfig 更高效。 如果未指定,则使用默认的清理器配置。

返回值

无(undefined)。

异常

  • TypeError 如果 options.sanitizer 传入以下值时会抛出此异常:
    • 非规范化的 SanitizerConfig(包含"allowed"和"removed"配置设置)
    • 值不是 “default” 的字符串
    • 不是 SanitizerSanitizerConfig 或字符串的值

描述

setHTML() 方法提供了一种XSS安全的方法来解析和清理HTML字符串,将其转换为 DocumentFragment,然后作为元素的子树插入到DOM中。

setHTML() 会丢弃HTML输入字符串中在当前元素上下文中无效的任何元素,例如<table>外部的<col>元素。然后它会移除清理器配置不允许的任何HTML实体,并进一步移除任何XSS不安全的元素或属性——无论它们是否被清理器配置允许。

如果在 options.sanitizer 参数中未指定清理器配置,setHTML() 将使用默认的 Sanitizer 配置。此配置允许所有被认为是XSS安全的元素和属性,从而禁止被认为不安全的实体。

可以指定自定义清理器或清理器配置来选择允许或移除哪些元素、属性和注释。请注意,即使清理器配置允许不安全的选项,在使用此方法时它们仍将被移除(这会隐式调用 Sanitizer.removeUnsafe())。

应将 setHTML() 用于将不受信任的HTML字符串插入元素,而不是使用 Element.innerHTML。除非有特定需要允许不安全的元素和属性,否则也应使用它而不是 Element.setHTMLUnsafe()

请注意,由于此方法始终清理XSS不安全实体的输入字符串,因此不使用可信类型API进行保护或验证。

示例

基本用法

此示例展示了使用 setHTML() 清理和注入HTML字符串的一些方法。

setHTML() 实时示例

此示例提供了使用不同清理器调用方法时的"实时"演示。代码定义了按钮,您可以点击分别使用默认和自定义清理器来清理和注入HTML字符串。原始字符串和清理后的HTML会被记录,以便您可以在每种情况下检查结果。

HTML

HTML定义了两个用于应用不同清理器的<button>元素,另一个用于重置示例的按钮,以及一个用于注入字符串的<div>元素。

JavaScript

首先我们定义要清理的字符串,所有情况都将使用相同的字符串。这包含<script>元素和onclick处理程序,两者都被认为是XSS不安全的。我们还定义了重新加载按钮的处理程序。

接下来我们定义使用默认清理器设置HTML的按钮的点击处理程序。这应该在插入HTML字符串之前剥离所有不安全的实体。请注意,您可以在 Sanitizer() 构造函数示例中确切看到哪些元素被移除。

下一个点击处理程序使用仅允许<div><p><script>元素的自定义清理器来设置目标HTML。请注意,因为我们使用的是 setHTML 方法,<script> 也将被移除!

结果

点击"Default"和"allowScript"按钮分别查看默认和自定义清理器的效果。请注意,在这两种情况下,<script>元素和onclick处理程序都被移除,即使清理器明确允许它们。

规范

浏览器兼容性

[查看完整的浏览器兼容性表]

参见

  • Element.setHTMLUnsafe()
  • ShadowRoot.setHTML()ShadowRoot.setHTMLUnsafe()
  • Document.parseHTML()Document.parseHTMLUnsafe()
  • HTML Sanitizer API
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计