我有一个应用程序可以在页面上放置的JavaScript字符串中生成各种各样的东西。我以为所有逃脱都没问题,但后来我遇到了一个奇怪的问题,我无法找到理由:
这不应该在HTML页面中合法:
<script type="text/javascript">
alert("hello </script>");
</script>
&#39;法律&#39;意味着它会产生hello </script>
的警报。
显然,我的盒子上的moz和chrome都会在警报字符串的</script>
部分之后关闭脚本,不会产生警报和混乱的输出。有没有人碰到这个,这是一个浏览器错误吗?
答案 0 :(得分:6)
HTML将其解析为:
<script type="text/javascript">
alert("hello
</script>
");
</script>
第一次出现</script>
关闭打开的<script>
元素。避免此问题的常见方法是在字符串中的\
字符前加/
:
<script type="text/javascript">
alert("hello <\/script>");
</script>
这是有效的,因为\
转义字符会阻止浏览器将<\/script>
识别为结束标记。通常\
用作JavaScript字符串中的转义序列,但由于没有\/
序列,因此忽略转义字符,字符串的计算结果为'</script'>
。
如果您遵循将所有javascript保存在外部.js
文件中的良好做法,通常可以避免此问题。也就是说,看到用于local script fallbacks for unresponsive CDNs的这种转义很常见。
答案 1 :(得分:3)
<script type="text/javascript">
alert('hello <'+'/script>');
</script>
<script type="text/javascript">
alert('hello <\/script>');
</script>
答案 2 :(得分:1)
你应该这样做
<script type="text/javascript">
// <![CDATA[
alert('hello </script>');
// ]]>
</script>
防止解析。