有时,服务器端会生成嵌入到内联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 = "alert(\'bug\')";
浏览器不会将"“解释为脚本块的末尾。因此,避免了XSS。
但是,仍然有"<“和">”。建议同时对这两个字符进行转义。首先,我不认为把"<“改成"<”,把">“改成">”是个好主意。而且,我不确定将"<“更改为"\<”和将">“更改为">”是否对所有浏览器都可识别。似乎没有必要对"<“和">”做进一步的编码。
对此有什么建议吗?
谢谢。
发布于 2009-04-23 08:06:51
根据您使用的标记语言,问题有不同的答案。
如果您使用的是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的文章。
发布于 2009-05-25 20:40:23
不,你不应该在超文本标记语言中的<script>中使用超文本标记语言实体来转义<和>。
\替换为\\,将"替换为\") </替换为<\/,以防止从<script>元素转义。在XHTML中,情况要复杂得多。
]]>替换]]]]><![CDATA[>以防止转义(除了XML escaping).text/html发送( 99%的人都这样做),那么你必须同时使用XML块、XML转义和HTML转义。发布于 2009-10-02 19:11:40
便宜而简单的方法:
<script type="text/javascript">
var username = "<%= Encode(UserName) %>";
</script>其中,Encode中的编码方案是将输入的每个字符转换为与JavaScript兼容的相关\xABCD表示。
另一种既便宜又简单的方法:
<script type="text/javascript">
var username = decodeBase64("<%= EncodeBase64(UserName) %>");
</script>如果您只处理ASCII。
当然,pst用严格的方式一针见血。
https://stackoverflow.com/questions/779959
复制相似问题