javascript - 是否有不同类型的 HTML 结束标记
问题描述
最近我在 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 语法 - 您可以通过将它(带有必要的样板,如下)粘贴到W3 HTML 验证器中来验证这一点。
<!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 调用函数的另一种方式,无需使用括号。这是由于标记模板文字的工作方式。因此,过时或有问题的 XSS 清理程序可能会被认为alert`hello`
是“安全的”,因为它不包含任何函数调用(由没有括号决定),但实际上它仍然执行alert
。
推荐阅读
- javascript - 有没有办法在特定的 Adwords 广告系列 ID 之后过滤谷歌分析嵌入 API 查询?
- java - 步骤执行状态在 Spring Batch 中没有像 Finished
- java - 有没有比使用反射通过继承层次结构中的工厂方法实例化元素更好的方法?
- delphi - 如何检测 THTTPReqResp SOAP 请求的特定(超时)错误?
- matlab - 来自 tstatistics 向量的 pvalues 向量?
- mfc - 我在 VS-2019 中缺少 Add new item Add "MFC Class From Typelib"
- r - 如何通过多个列为每个 id 连接表
- image - SwiftUI 上的 Image 中的 frame() 是否会针对每个设备具有不同的大小?
- java - Java 优化读/写共享资源/内存位置,无需 Atomic API,例如 AtomicInteger
- java - Extend Single ID REST endpoint to support multiple IDs