繁体   English   中英

是否有必要为javascript字符串“转义”字符“<”和“>”?

[英]Is it necessary to “escape” character “<” and “>” for javascript string?

有时,服务器端将生成要嵌入内联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 =“</ script> alert(\\'bug \\')</ script > </ SCRIPT>“;

浏览器不会将“ </ script> ”解释为脚本块的结尾。 所以,XSS避免了。

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

对此有什么建议吗?

谢谢。

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

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

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

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

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

不久前,我写了一些关于这个的方法和原因

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

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

在XHTML中它更复杂。

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

便宜又简单的方法:

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

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

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

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

如果你只处理ASCII。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM