JavaScript 字符串中的脚本标记

IT技术 javascript
2021-01-19 22:59:10

我遇到了一个问题,即在 JavaScript 中的带引号的字符串中有一个结束脚本标记,并且它正在终止脚本。我认为这不是预期的行为。一个例子可以在这里看到:http : //jsbin.com/oqepe/edit

我感兴趣的测试用例浏览器:Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.4) Gecko/20091028 Ubuntu/9.10 (karmic) Firefox/3.5.4。

2个回答

怎么了?

浏览器 HTML 解析器将看到</script>字符串内的 ,并将其解释为脚本元素的结尾。

看看这个例子的语法着色:

<script>
var test = 'foo... </script> bar.....';
</script>

请注意,单词bar被视为脚本元素之外的文本内容......

一种常用的技术是使用连接运算符:

var test = '...... </scr'+'ipt>......';
转义 /,不要将字符串分成几部分。IIRC 它仍然是 HTML 4.x 中的错误。打字肯定更繁琐,读起来更麻烦,要处理的字符更多,而且效率更低(因为字符串连接并不是最便宜的 JS 操作)
2021-03-12 22:59:10
这是一个违反直觉的安全漏洞。事实上,这是一个 XSS 漏洞,应该通过遵循规则来防止,而不仅仅是一些“中间分裂”。
2021-03-29 22:59:10
是的,您只需要添加一个反斜杠 var t = 'my tag <\/script> for script';
2021-04-03 22:59:10
这确实有效,但我很惊讶我必须这样做。部分问题是我正在抓取页面并将结果存储在 JS 变量中。我对回来的东西没有真正的期望。
2021-04-10 22:59:10
你如何将它存储在变量中?您是否正在抓取服务器端然后生成var x = <string>;如果是这样,请不要忘记对其进行 JSON 编码。
2021-04-10 22:59:10

您需要对其进行转义,否则它将成为 HTML 的一部分。

var test = 'what the hell... \<\/script\> \<h1\>why?!?!?!\<\/h1\>';
转义的好解决方案,但除了脚本标记的斜杠之外,其他任何东西都不需要。
2021-03-22 22:59:10
@LiraNuna 嗯。否。XML 解析器将</script>视为“脚本结束”和</notscript>格式良好错误。HTML 解析器将</anything>视为“脚本结束”,然后将其</notscript>视为“规范未定义的处理错误”。只有一个标签汤解析器(可能还有一个 HTML5 解析器,我还没有仔细阅读草稿来确定)会被</notscript>视为脚本的一部分。
2021-03-24 22:59:10
这是呈现 XML 的方式。您还可以使用 <![CDATA[ 和 ]]> 包装脚本。其他标签不会发生这种情况,因为 XML 解析器的工作方式(特别是它将脚本视为文本,而不是代码)。
2021-04-01 22:59:10
哦,如果你用 CDATA 标记包裹,那么这将无法修复标签汤解析器。
2021-04-05 22:59:10