是否有不同类型的 HTML 结束标签
Are there different types of HTML closing tags
最近我在 HTML 中遇到了这种类型的标签:
<x/ id="someId" onpointermove=alert`hello`>
此数据作为 JSON 从服务器获取,然后写入 HTML 视图。
HTML 视图显示的数据没有问题。
但是,在 运行 刚刚在新选项卡中获取数据的请求中,Javascript 代码是 运行。
这段代码如何运行?
我只知道这种自闭标签:<x id="someId" />
。
那么,我遇到的这种不同类型的标签是什么?
此外,这是使用反引号的另一种方式吗?
我一开始以为是字符串插值的一种。但是我在其中找不到对这种特定类型代码的任何引用。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
这是故意不正确的 HTML 语法 - 您可以通过将其粘贴(在下面使用必要的样板)到 the W3 HTML validator.
来验证这一点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>a</title>
</head>
<body>
<x/ id="someId" onpointermove=alert`hello`>
</body>
</html>
这给出了几个验证错误。
不过,不像XML,HTML是很宽容的。它会尽最大努力呈现 something,即使它给出的内容显然是错误的。关于如何执行此操作有复杂的规则,但现在 几乎 至少在现代浏览器之间总是一致的(如果不是,那是由于错误,而不是意见分歧供应商之间)。
在这种情况下,它呈现的内容实际上解析为以下 outerHTML
:
<x id="someId" onpointermove="alert`hello`">
</x>
像这样的格式错误的语法经常被用来故意测试 XSS 预防的限制,因为 XSS 预防可能认为它是“安全的”,即使浏览器实际上会呈现危险。
这里特别有趣的是 alert`hello`
- 反引号是另一种让 JavaScript 调用函数的方式, 无需使用括号 。这是由于 tagged template literals 的工作方式。因此,out-of-date 或有缺陷的 XSS 消毒程序可能会认为 alert`hello`
是“安全的”,因为它不包含任何函数调用(由没有括号决定),但实际上它仍然执行 alert
。
最近我在 HTML 中遇到了这种类型的标签:
<x/ id="someId" onpointermove=alert`hello`>
此数据作为 JSON 从服务器获取,然后写入 HTML 视图。 HTML 视图显示的数据没有问题。 但是,在 运行 刚刚在新选项卡中获取数据的请求中,Javascript 代码是 运行。
这段代码如何运行?
我只知道这种自闭标签:<x id="someId" />
。
那么,我遇到的这种不同类型的标签是什么?
此外,这是使用反引号的另一种方式吗?
我一开始以为是字符串插值的一种。但是我在其中找不到对这种特定类型代码的任何引用。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
这是故意不正确的 HTML 语法 - 您可以通过将其粘贴(在下面使用必要的样板)到 the W3 HTML validator.
来验证这一点<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>a</title>
</head>
<body>
<x/ id="someId" onpointermove=alert`hello`>
</body>
</html>
这给出了几个验证错误。
不过,不像XML,HTML是很宽容的。它会尽最大努力呈现 something,即使它给出的内容显然是错误的。关于如何执行此操作有复杂的规则,但现在 几乎 至少在现代浏览器之间总是一致的(如果不是,那是由于错误,而不是意见分歧供应商之间)。
在这种情况下,它呈现的内容实际上解析为以下 outerHTML
:
<x id="someId" onpointermove="alert`hello`">
</x>
像这样的格式错误的语法经常被用来故意测试 XSS 预防的限制,因为 XSS 预防可能认为它是“安全的”,即使浏览器实际上会呈现危险。
这里特别有趣的是 alert`hello`
- 反引号是另一种让 JavaScript 调用函数的方式, 无需使用括号 。这是由于 tagged template literals 的工作方式。因此,out-of-date 或有缺陷的 XSS 消毒程序可能会认为 alert`hello`
是“安全的”,因为它不包含任何函数调用(由没有括号决定),但实际上它仍然执行 alert
。