【问题标题】:Script tag in JavaScript string [duplicate]JavaScript字符串中的脚本标签[重复]
【发布时间】:2010-12-12 04:45:28
【问题描述】:

我遇到了一个问题,即在 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。

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    var test = 'what the hell... \<\/script\> \<h1\>why?!?!?!\<\/h1\>';
    

    【讨论】:

    • 这是呈现 XML 的方式。您还可以使用 包装脚本。其他标签不会发生这种情况,因为 XML 解析器的工作方式(特别是将脚本视为文本,而不是代码)。
    • @LiraNuna 嗯。不会。XML 解析器会将&lt;/script&gt; 视为“脚本结束”,将&lt;/notscript&gt; 视为格式错误。 HTML 解析器会将&lt;/anything&gt; 视为“脚本结束”,然后将&lt;/notscript&gt; 视为“规范未定义的处理错误”。只有标签汤解析器(也可能是 HTML5 解析器,我还没有仔细阅读草稿无法确定)会将 &lt;/notscript&gt; 视为脚本的一部分。
    • 哦,如果您使用 CDATA 标记进行包装,那么对于标签汤解析器将无法修复它。
    • 很好的解决方案转义,但除了脚本标签的斜线之外真的不需要任何东西。
    【解决方案2】:

    会发生什么?

    浏览器 HTML 解析器将在字符串中看到 &lt;/script&gt;,并将其解释为脚本元素的结尾。

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

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

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

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

    var test = '...... </scr'+'ipt>......';
    

    【讨论】:

    • 这确实有效,但我很惊讶我必须这样做。部分问题是我正在抓取页面并将结果存储在 JS 变量中。我对即将回归的东西没有真正的期望。
    • 如何将它存储在变量中?你是在抓取服务器端然后生成var x = &lt;string&gt;; 吗?如果是这样,请不要忘记对其进行 JSON 编码。
    • 转义 /,不要将字符串分成几部分。 IIRC 它仍然是 HTML 4.x 中的错误。当然,打字更繁琐,阅读更麻烦,要处理的字符更多,效率更低(因为字符串连接并不是 JS 操作中最便宜的)
    • 是的,您只需要添加一个反斜杠var t = 'my tag &lt;\/script&gt; for script';
    • 这是一个违反直觉的安全漏洞。事实上,这是一个 XSS 漏洞,应该通过关注the rules 来预防,而不仅仅是一些“中间分裂”。
    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2020-07-10
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多