首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >javascript字符串是否需要“转义”字符"<“和">”?

javascript字符串是否需要“转义”字符"<“和">”?
EN

Stack Overflow用户
提问于 2009-04-23 01:27:42
回答 3查看 13.2K关注 0票数 17

有时,服务器端会生成嵌入到内联JavaScript代码中的字符串。例如,如果"UserName“应该由ASP.NET生成,那么它看起来就像。

代码语言:javascript
运行
复制
<script>
   var username = "<%UserName%>";
</script>

这是不安全的,因为用户的名字可以是

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

这是XSS漏洞。

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

代码语言:javascript
运行
复制
<script>
   var username = "<% JavascriptEncode(UserName)%>";
</script>

JavascriptEncode所做的是在"/“、"'”和“”之前添加字符"\“,因此,输出的html类似于. var username = "alert(\'bug\')";

浏览器不会将"“解释为脚本块的末尾。因此,避免了XSS。

但是,仍然有"<“和">”。建议同时对这两个字符进行转义。首先,我不认为把"<“改成"<”,把">“改成">”是个好主意。而且,我不确定将"<“更改为"\<”和将">“更改为">”是否对所有浏览器都可识别。似乎没有必要对"<“和">”做进一步的编码。

对此有什么建议吗?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2009-04-23 08:06:51

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

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

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

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

代码语言:javascript
运行
复制
<script type="text/javascript">
// <![CDATA[
  …
// ]]>
</script>

不久前,我写了一些关于the hows and whys of this的文章。

票数 16
EN

Stack Overflow用户

发布于 2009-05-25 20:40:23

不,你不应该在超文本标记语言中的<script>中使用超文本标记语言实体来转义<>

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

在XHTML中,情况要复杂得多。

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

Stack Overflow用户

发布于 2009-10-02 19:11:40

便宜而简单的方法:

代码语言:javascript
运行
复制
<script type="text/javascript">
    var username = "<%= Encode(UserName) %>";
</script>

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

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

代码语言:javascript
运行
复制
<script type="text/javascript">
    var username = decodeBase64("<%= EncodeBase64(UserName) %>");
</script>

如果您只处理ASCII。

当然,pst用严格的方式一针见血。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/779959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档