如何在 <script> 标签中正确转义内联 Javascript?

Fli*_*imm 5 html javascript xhtml

我正在为一个框架编写一个服务器端函数,它可以让我内联一个 Javascript 文件。它以文件名作为输入,其输出如下所示:

<script>
   /* contents of Javascript file */
</script>
Run Code Online (Sandbox Code Playgroud)

如何安全地转义 Javascript 文件的内容?

如果文件包含类似</script>. 如果输入的 Javascript 文件有语法错误,我仍然希望它正确转义。我还意识到 XHTML 需要对某些实体进行编码,而 HTML 则不需要。

有很多类似的问题询问如何转义字符串文字或 JSON。但是我想要一些可以处理一般情况的东西,以便我可以为一般情况编写一个工具。

(我意识到内联可能不受信任的 Javascript 并不是最好的主意,因此无需花时间讨论。)

Fli*_*imm 3

这是一项正在进行的工作,如果我错过了一个极端案例,请告诉我!

根据您使用的是 XHTML 还是 HTML,答案会有所不同。

1.带Content-Type: application/xhtml+xml标题的XHTML

在这种情况下,您可以简单地通过 XML 转义任何实体,从而转换此文件:

console.log("Example Javascript file");
console.log(1</script>2/);
console.log("That previous line prints false");
Run Code Online (Sandbox Code Playgroud)

对此:

<script>
console.log(&quot;Example Javascript file&quot;);
console.log(1&lt;/script&gt;2/);
console.log(&quot;That previous line prints false&quot;);
</script>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用具有不同Content-Type标头的 XHTML,则不同浏览器的行为可能会有所不同,而且我还没有研究过,因此我建议修复标Content-Type头。

2. HTML

不幸的是,我知道在这种情况下没有办法正确地转义它(至少不解析 JavaScript)。将所有实例替换为/with\/会导致某些 Javascript 崩溃,包括前面的示例。

我能推荐的最好的办法是不区分大小写地搜索</script,如果找到它就抛出异常。如果您只处理字符串文字或 JSON,请将所有实例替换/\/

一些 Javascript 压缩器可能会以一种安全的方式处理</script,如果你找到了,请告诉我。