是否有必要“逃避”字符“<”和“>”对于javascript字符串?

时间:2009-04-23 01:27:42

标签: javascript html xss encode

有时,服务器端将生成要嵌入内联JavaScript代码的字符串。例如,如果“UserName”应由ASP.NET生成。然后看起来像。

<script>
   var username = "<%UserName%>";
</script>

这不安全,因为用户可以将他/她的名字设为

</script><script>alert('bug')</script></script>

这是XSS漏洞。

所以,基本上,代码应该是:

<script>
   var username = "<% JavascriptEncode(UserName)%>";
</script>

JavascriptEncode 的作用是在“/”,“'”和“”之前添加字符“\”。因此,输出html就像。             var username =“&lt; / script&gt; alert(\'bug \')&lt; / script&gt;&lt; / script&gt;”;     

浏览器不会将“ &lt; / script&gt; ”解释为脚本块的结尾。所以,XSS在避免。

然而,仍有“&lt;”和“&gt;”那里。建议也要逃避这两个字符。首先,我认为改变“&lt;”不是一个好主意。到“&amp; lt;”和“&gt;”到“&amp; gt;”这里。而且,我不确定改变“&lt;”到“\&lt;”和“&gt;”到“\&gt;”可以被所有浏览器识别。似乎没有必要对“&lt;”进行进一步编码和“&gt;”。

对此有什么建议吗?

感谢。

3 个答案:

答案 0 :(得分:16)

根据您使用的标记语言,问题有不同的答案。

如果您使用的是HTML,那么您不能用实体来表示它们,因为脚本元素被标记为包含CDATA。

如果您使用的是XHTML,那么您可以使用明确的CDATA标记将它们表示为CDATA,或者您可以使用实体来表示它们。

如果您正在使用XHTML,但是将其作为text / html提供,那么您需要编写符合XHTML规则但仍适用于text / html解析器的内容。这通常意味着使用显式CDATA标记并在JavaScript中对它们进行注释。

<script type="text/javascript">
// <![CDATA[
  …
// ]]>
</script>

前段时间,我写了一些关于the hows and whys of this的内容。

答案 1 :(得分:13)

不,您不应该使用HTML中<内的HTML实体来逃避><script>

  • 使用JavaScript字符串转义规则(将\替换为\\,将"替换为\"
  • </的所有出现替换为<\/,以防止转出<script>元素。

在XHTML中它更复杂。

  • 如果您将XHTML作为XML(与IE不兼容的方式)发送并且不使用CDATA块,那么除了JavaScript字符串转义之外,您还需要转义实体。
  • 如果您将XHTML作为XML发送并使用CDATA块,则不要转义实体,而是将]]>替换为]]]]><![CDATA[>以防止转义它(除了JavaScript字符串转义)。< / LI>
  • 如果您将XHTML发送为text/html(99%的人会这样做),那么您必须同时使用XML CDATA块,XML CDATA转义和HTML转义。

答案 2 :(得分:2)

便宜又简单的方法:

<script type="text/javascript">
    var username = "<%= Encode(UserName) %>";
</script>

Encode中的编码方案是将输入的每个字符转换为与JavaScript兼容的关联\xABCD表示。

另一种便宜又简单的方法:

<script type="text/javascript">
    var username = decodeBase64("<%= EncodeBase64(UserName) %>");
</script>

如果您只处理ASCII。

当然,pst以严格的方式击中了头部。