有时,服务器端会生成嵌入到内嵌JavaScript代码中的字符串。例如,如果“UserName”应该由ASP.NET生成。然后它看起来像。是否需要为javascript字符串“转义”字符“<" and ">”?
<script>
var username = "<%UserName%>";
</script>
这是不是安全,因为用户可以有他/她的名字是
</script><script>alert('bug')</script></script>
这是XSS漏洞。
所以,基本上,代码应该是:
<script>
var username = "<% JavascriptEncode(UserName)%>";
</script>
JavascriptEncode做什么是添加系统字符 “\” 前 “/” 和 “”“ 和 ”“”所以,输出HTML。就像 VAR的用户名= “</SCRIPT>警报(\ '错误\')</SCRIPT> </SCRIPT>”;
浏览器将不解释“</script>“作为脚本块的结束。所以,XSS避免了。
但是,在那里仍然存在“<”和“>”。建议也要避开这两个字符。首先,我不认为将“<”更改为“& lt”是个好主意和“>”改为“& gt”;这里。而且,我不确定将“<”更改为“\ <”,并且“>”可以被所有浏览器识别。看起来没有必要对“<”和“>”做进一步的编码。
对此有什么建议吗?
谢谢。
但是CDATA块内的`]]>`中的`>`必须由`>`重新设置。因此`foo [bar [0]]> 1234`必须替换为`foo [bar [0]] < 1234`或`foo [bar [0]]> 1234`。否则,CDATA块将被过早关闭。 – Gumbo 2009-05-25 21:02:28
由于CDATA呈现&字符的意思是“&”而不是“实体的开始” - 这是行不通的。如果你需要在CDATA中表示字符串“]]>”,那么我很肯定你很勉强,应该使用实体来开始(在CDATA块之外) – Quentin 2009-05-26 06:55:11
或者只是添加一个空格:`foo [bar [0 ]]> 1234` - 或者如果它是字符串的一部分:`'foo [bar [0]]'+'> 1234' - 或者只包含所有脚本在外部.js文件中。 – gnarf 2009-10-02 18:33:58