Javascript 当我们关闭脚本两次时会发生什么?
这可能是一个愚蠢的问题,但我想澄清一下。当我们关闭javascript两次时会发生什么Javascript 当我们关闭脚本两次时会发生什么?,javascript,Javascript,这可能是一个愚蠢的问题,但我想澄清一下。当我们关闭javascript两次时会发生什么 <script type="text/javascript"> alert("hello"); </script> </script> 警惕(“你好”); 我这样做了,但没有得到任何错误。这就像我们关闭了脚本,所以不会有任何执行,所以我相信不会触发任何错误。这在任何情况下都会制造麻烦吗 为什么我要问这个问题?我想在用户提交脚本的插件末尾插入一个。这样我就不必在验证时进
<script type="text/javascript">
alert("hello");
</script>
</script>
警惕(“你好”);
我这样做了,但没有得到任何错误。这就像我们关闭了脚本,所以不会有任何执行,所以我相信不会触发任何错误。这在任何情况下都会制造麻烦吗
为什么我要问这个问题?我想在用户提交脚本的插件末尾插入一个
。这样我就不必在验证时进行额外的编码,如果这工作正常,不会产生任何问题大多数浏览器只会删除/忽略额外的标记。我看不出这会造成任何问题,但这是一种相当丑陋的方式。不过,我目前没有更好的建议。没有。浏览器会忽略它,但它显然不会通过标准
据我所知,如果浏览器遇到一个开始的
标记,它会假定所有内容,直到结束的
标记是脚本。因此,从
开始将不会产生任何效果,但会导致“意外”异常。效果可能会因浏览器而异,但实际上都会忽略第二个标记。浏览器会将其视为额外的意外结束标记。不管它是
,它也可以是
或同一上下文中允许的任何其他内容
除非您启用strict/XML模式,否则大多数浏览器都会默默地忽略这些额外的标记。对于严格模式,您应该在控制台中获得错误
为了正确包装用户提供的插件,我建议采用以下策略:
- 始终将它们包装在您自己的标记中(以便确保结构始终正确)
- 检查放置在两个标记之间的字符串是否为
XHTML规则比HTML规则严格得多。当特殊的XML 字符(例如&和
而且这不是一种正确的做法,如果脚本是内联的,那么它将破坏W3C合规性。回答您的直接问题:不会发生任何事情,只是浏览器忽略了无效的(x)HTML 要回答您的间接问题,请在评论中找到: @Dan来自德国,所以你是说验证是唯一的方法,否则不推荐这种方法 外部资源的验证始终至关重要 例如,只需将外部脚本读入
标记,即可告诉浏览器“这不是外部内容”,并据此授予更多访问权限,例如,读取您的Cookie并设置源自您的域的Cookie(外部内容…您的域) 从不同的主机/域通过
包含外部JS会告诉浏览器“这是第三方脚本,不允许像内部脚本那样使用它。”因此,不允许读取或设置cookie和其他内容 为什么输入
没有帮助: 攻击者很容易破坏你的整个网站,让它轻易消失 见下文:<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 !-->
但是,如果您防止这种情况发生,攻击者始终可以使用攻击者网站启动 下面的一切都消失了
将HTML插入您的网站 最好的方法可能是通过iframe从一个空白页面和一个独立的(子)域执行给定的JSdocument.write();
将内容放入数据库,或者保存一个JS并让其他用户执行,需要额外的验证。我认为浏览器忽略了它。但它不是有效的XHTML。这样做的目的是什么?这是额外的无效标记,你为什么还要使用它?如果需要,你的项目不会通过添加关闭脚本标记而变得更安全这就是你的想法。例如,我的脚本以
(甚至不要认为你可以禁止文档结尾。写(“”
文档。写
)我知道
文档。写
。上面的要点是防止意外使用不应该存在的
标记。如果攻击者想要破坏规则,那么你需要分析攻击并找到解决方案。没有通用的总是安全的解决方案。它会导致任何问题吗?我的插件情况是用户将继续使用查看他们在脚本部分给出的内容预览。例如,jsfiddle之类的东西。jsfiddle确实在空白页中执行,但最重要的是,在独立域(从jsfiddle.net到)下执行,因此执行的脚本作为第三方脚本执行。<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 !-->