这可能是一个愚蠢的问题,但我想澄清一下。当我们两次关闭javascript时会发生什么。
<script type="text/javascript">
alert("hello");
</script>
</script>
我做了这个但是没有得到任何错误。就像我们关闭脚本所以不会有任何执行所以没有错误会触发我相信。这会在任何情况下造成麻烦吗?
为什么要问这个是我想在用户提交脚本的插件末尾插入一个</script>
。因此,如果在没有造成任何麻烦的情况下工作正常,我就不必去验证额外的编码
答案 0 :(得分:2)
浏览器会将此视为额外的意外结束标记。它是</script>
并不重要,它也可以是</link>
或在同一上下文中允许的任何其他内容。
除非启用strict / XML模式,否则大多数浏览器会默默忽略此类额外标记。对于严格模式,您应该在控制台中出错。
为了正确包装用户提供的插件,我建议采用以下策略:
始终将它们包装在您自己的标签中(这样您就可以确保结构始终正确)。
检查您在<script
,<script>
和</script>
的两个标记之间添加的字符串,如果找到任何标记,则会报错。
这里的想法是,用户不应该在代码中使用脚本标记,而是将它们放在它们所属的位置。
答案 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并让其由不同的用户执行需要额外的验证。