繁体   English   中英

是否有不同类型的 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 语法 - 您可以通过将其(带有必要的样板,如下)粘贴到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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM