有时,服务器端将生成要嵌入内联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;”。
对此有什么建议吗?
感谢。
答案 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>
。
\
替换为\\
,将"
替换为\"
)</
的所有出现替换为<\/
,以防止转出<script>
元素。在XHTML中它更复杂。
]]>
替换为]]]]><![CDATA[>
以防止转义它(除了JavaScript字符串转义)。< / LI>
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
以严格的方式击中了头部。