当我们关闭脚本两次时会发生什么



这可能是一个愚蠢的问题,但我想澄清一下。当我们关闭一个javascript两次时会发生什么。

<script type="text/javascript">
alert("hello");
</script>
</script>

我这样做了,但没有得到任何错误。就像我们关闭了脚本,所以不会有任何执行,所以我相信不会触发任何错误。这会在任何情况下制造麻烦吗?

为什么要问这个问题,是因为我想在用户提交脚本的插件末尾插入一个</script>。这样我就不必在验证时进行额外的编码,如果这能很好地工作而不会产生任何问题

浏览器会将其视为一个额外的、意外的结束标记。它是</script>并不重要,它也可以是</link>或在同一上下文中允许的任何其他内容。

除非您启用严格/XML模式,否则大多数浏览器都会默默地忽略这些额外的标记。对于严格模式,您应该在控制台中得到错误。

为了正确包装用户提供的插件,我建议使用以下策略:

  • 总是把它们包装在自己的标签中(这样你就可以确保结构总是正确的)。

  • 检查放在<script<script></script>的两个标记之间的字符串,如果发现其中任何一个,则报告错误。

这里的想法是,用户永远不应该在他们的代码中使用脚本标记,而应该把它们放在它们所属的位置。

大多数浏览器只会删除/忽略一个额外的标记。我看不出这会引起任何问题,但这是一种相当丑陋的方式。不过,我目前没有更好的建议。

什么都没有。浏览器会忽略它,但它显然不会通过标准。

据我所知,如果浏览器遇到一个打开的<script>标记,它会假设所有内容,直到关闭的</script>标记是脚本。所以从CCD_ 9开始不会有任何效果,只会导致"意外"的异常。

效果可能会根据浏览器的不同而变化,但通常都会忽略第二个标记。

XHTML规则比HTML规则严格得多。当特殊XMLXHTML文件中的脚本中使用字符(如&和<),它们导致错误。最简单的解决方法是使用外部脚本文件。然而,如果您只是必须编写内联脚本,那么您将需要在文件中包含CDATA(字符数据)部分。CDATA内特殊的XML字符可以自由使用。以下内容示例使用了一个与XHTML和HTML语法。

<script type="text/javascript">
//<![CDATA[
  alert((1 < 2) && (3 > 2));
//]]>
</script>

此外,这不是一种正确的做法,如果脚本是内联的,那么它将违反W3C的合规性

要回答您的直接问题:什么都不会发生,这只是浏览器忽略的无效(x)HTML。

为了回答你的间接问题,请在评论中找到:

@DanFromGermany所以你说验证是唯一的方法,否则这种方法不建议

外部资源的验证始终至关重要。

例如,只需将外部脚本读取到<script></script>标签中,告诉浏览器"这不是外部内容",并由此授予更多访问权限,例如,读取您的cookie并设置源自您的域(外部内容……您的域)的cookie。

包括来自不同主机/域的通过<script src="...">的外部JS,告诉浏览器"这是第三方脚本,不要像内部脚本那样允许它。"因此,不允许读取或设置Cookie和其他内容。

为什么放入</script>没有帮助:

攻击者很容易破坏你的整个网站并让它轻易消失。

参见以下内容:

<script>
<!-- external script start -->
</script>
</head>
<body>
Attackers website start

<div style="display:hidden;">
everything below disappears
<!--
<!-- external script end -->
</script>
</head>
<body>
<!-- your website start !-->

尽管如此,如果你阻止了这种情况,攻击者总是可以使用document.write();将HTML插入你的网站。

最好的方法可能是通过一个iframe,从一个空白页面和一个独立的(子)域执行给定的JS。

将东西放入数据库,或者保存一个JS并让它由不同的用户执行,都需要额外的验证。

相关内容

最新更新