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

时间:2015-12-31 11:23:44

标签: javascript html xhtml

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

&#xA;&#xA;
 &lt; script&gt;&#xA; / * Javascript文件的内容* /&#xA;&lt; / script&gt;&#xA;  
&#xA;&#xA;

如何逃避内容安全的Javascript文件?

&#xA;&#xA;

如果文件包含&lt; / script&gt; 之类的内容,我特别担心。如果输入的Javascript文件有语法错误,我仍然希望它正确转义。我也意识到XHTML期望一些实体被编码,而HTML则没有。

&#xA;&#xA;

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

&#xA;&#xA;

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

&#xA;

1 个答案:

答案 0 :(得分:2)

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

&#xA;&#xA;

根据您使用的是XHTML还是HTML

&#XA;&#XA;

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

&#xA;&#xA;

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

&#xA;&#xA;
  console.log(“示例Javascript文件”);&#xA; console.log(1&lt; / script&gt; 2 /);&#xA; console.log(“前一行打印为false”);&#xA;  
&#xA;&#xA;

对此:

&#xA;&#xA ;
 &lt; script&gt;&#xA; console.log(&amp; quot; Example Javascript file&amp; quot;);&#xA; console.log(1&amp; lt; / script&amp; gt; 2 / );&#xA; console.log(&amp; quot;前一行打印false&amp; quot;);&#xA;&lt; / script&gt;&#xA;  
&#xA;& #xA;

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

&#xA;&#xA;

2。 HTML

&#xA;&#xA;

不幸的是,我知道在这种情况下无法正确地逃避它(至少不解析Javascript)。用 \ / 替换 / 的所有实例会导致一些Javascript中断,包括上一个例子。

&#xA;&#xA;

我建议的最好的是你不区分大小写地搜索&lt; / script 并在你找到它时抛出异常。如果您只处理字符串文字或JSON,请将 / 的所有实例替换为 \ /

&#xA;&#xA;

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

&#xA;