问题描述
最近,我在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非常宽容。即使给出的内容很明显是错误的,它也会尽力呈现某物。有关如何执行此操作的规则很复杂,但如今,现代浏览器之间至少几乎始终保持一致(如果不是,则是由于存在错误,而不是厂商之间的意见分歧)
在这种情况下,它呈现的内容实际上解析为以下outerHTML
:
<x id="someId" onpointermove="alert`hello`">
</x>
像这样格式错误的语法通常用于故意测试XSS防护的极限,因为即使浏览器实际上会带来危险,XSS防护也可能将其视为“安全”。
这里特别令人感兴趣的是alert`hello`
-反引号是使JavaScript调用函数的另一种方法,不使用括号。这是由于tagged template literals的工作方式。因此,过时或有问题的XSS清理程序可能会认为alert`hello`
是“安全的”,因为它不包含任何函数调用(由无括号确定),但实际上它仍然执行alert
。