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

时间:2013-08-28 10:36:30

标签: javascript

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

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

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

为什么要问这个是我想在用户提交脚本的插件末尾插入一个</script>。因此,如果在没有造成任何麻烦的情况下工作正常,我就不必去验证额外的编码

6 个答案:

答案 0 :(得分:2)

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

除非启用strict / XML模式,否则大多数浏览器会默默忽略此类额外标记。对于严格模式,您应该在控制台中出错。

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

  • 始终将它们包装在您自己的标签中(这样您就可以确保结构始终正确)。

  • 检查您在<script<script></script>的两个标记之间添加的字符串,如果找到任何标记,则会报错。

    < / LI>

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

答案 1 :(得分:1)

大多数浏览器只会删除/忽略额外的标记。我不明白它会导致任何问题,但这是一个非常难看的方式。我目前没有更好的建议。

答案 2 :(得分:0)

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

据我所知,如果浏览器遇到开始<script>标记,它会假定所有内容,直到结束</script>标记为脚本。所以从</script>开始将无效,但会导致'意外'异常。

答案 3 :(得分:0)

效果可能会因浏览器而异,但理论上都忽略了第二个标记。

答案 4 :(得分:0)

  

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

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

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

答案 5 :(得分:0)

回答你的直接问题:什么都不会发生,它只是浏览器忽略的无效(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并让其由不同的用户执行需要额外的验证。