<script>标记中的JavaScript字符串中的</ script>

joo*_*kos 1 html javascript

我有一个应用程序,可以生成各种各样的东西到页面上的JavaScript字符串.我以为所有逃脱都没问题,但后来我遇到了一个奇怪的问题,我无法找到理由:

在html页面中这不应该是合法的:

<script type="text/javascript">
    alert("hello </script>");
</script>
Run Code Online (Sandbox Code Playgroud)

'合法'意味着它会产生警报hello </script>.

显然,我的盒子上的moz和chrome都会</script>在警报字符串的一部分之后关闭脚本,不会产生任何警报和混乱的输出.有没有人碰到这个,这是一个浏览器错误吗?

zzz*_*Bov 6

HTML将其解析为:

<script type="text/javascript">
    alert("hello 
</script>
");
</script>
Run Code Online (Sandbox Code Playgroud)

第一次出现</script>关闭open <script>元素.避免这个问题的常用方法是通过包括\在之前/的字符串中的字符:

<script type="text/javascript">
    alert("hello <\/script>");
</script>
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为\转义字符将阻止浏览器识别<\/script>为结束标记.通常\用作JavaScript字符串中的转义序列,但由于没有\/序列,因此忽略转义字符并将字符串计算为'</script'>.

如果您遵循将所有javascript保存在外部.js文件中的良好做法,通常可以避免此问题.也就是说,通常会看到这种转义用于无响应CDN的本地脚本回退.