【问题标题】:How do I properly escape inline Javascript in a <script> tag?如何在 <script> 标记中正确转义内联 Javascript?
【发布时间】:2016-04-05 09:15:23
【问题描述】:

我正在为一个框架编写一个服务器端函数,它可以让我内联一个 Javascript 文件。它将文件名作为输入,它的输出是这样的:

<script>
   /* contents of Javascript file */
</script>

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

如果文件包含&lt;/script&gt; 之类的内容,我会特别担心。如果输入的 Javascript 文件有语法错误,我仍然希望它正确转义。我还意识到 XHTML 需要对某些实体进行编码,而 HTML 不需要。

有很多类似的问题询问how to escape string literals or JSON。但是我想要一些可以处理一般情况的东西,这样我就可以为一般情况编写一个工具。

(我意识到内联可能不受信任的 Javascript 并不是最好的主意,所以没必要花时间讨论这个问题。)

【问题讨论】:

  • 您始终可以使用数据 URI:&lt;script src="data:application/javascript,...">

标签: javascript html xhtml


【解决方案1】:

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

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

1。 XHTML 与 Content-Type: application/xhtml+xml 标头

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

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

到这里:

<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>

请注意,如果您使用带有不同 Content-Type 标头的 XHTML,那么不同的浏览器可能会有不同的行为,我还没有研究过,所以我建议修复 Content-Type 标头。

2。 HTML

不幸的是,我知道在这种情况下无法正确转义它(至少不解析 Javascript)。将所有 / 实例替换为 \/ 会导致一些 Javascript 中断,包括前面的示例。

我可以推荐的最好的方法是不区分大小写地搜索&lt;/script,如果找到则抛出异常。如果您只处理字符串文字或 JSON,请将 / 的所有实例替换为 \/

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

【讨论】:

  • 提供一个知道它是被转义的脚本元素的主体。然后基于 HTML5 解析器算法,我相信当下一个字符是 U+0009 CHARACTER TABULATION (tab), U+000A LINE FEED (LF), U+ 之一时替换&lt;/script(以及所有大写变体) 000C FORM FEED (FF)、U+0020 SPACE、U+002F SOLIDUS (/)、U+003E GREATER-THAN SIGN (>) with &lt;\/script 应该适用于 HTML 案例。
  • 你不必在 XHTML 中转义引号;转义 &amp;&lt; 就足够了。只要您绝对确定文档具有 XML 文件类型。
  • @Alohci: 但将其替换为 &lt;\/script 会导致 Javascript 语法错误,而以前可能没有。我承认 Javascript 1&lt;/script&gt;/ 有点做作,但它是有效的 Javascript,我想找到一种永远不会破坏 Javascript 的方法,以满足我的好奇心。
  • 啊,是的。我明白你现在在说什么了。谢谢。
  • HTML 不也可以使用&lt;/ script&gt; 结束标签吗?
猜你喜欢
  • 1970-01-01
  • 2015-04-22
  • 2010-11-13
  • 1970-01-01
  • 2016-02-05
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多