在哪里可以找到 JSON ajax 返回类型所需的转义字符列表?

问题描述 投票:0回答:6

我有一个返回 JSON 对象的 ASP.NET MVC 操作。

JSON:

{status: "1", message:"", output:"<div class="c1"><div class="c2">User generated text, so can be anything</div></div>"}

目前我的 HTML 正在破坏它。输出字段中将有用户生成的文本,因此我必须确保转义所有需要转义的内容。

有人有我需要逃离的所有事情的清单吗?

我没有使用任何 JSON 库,只是自己构建字符串。

asp.net-mvc json escaping
6个回答
75
投票

看看 http://json.org/。它声称的转义字符列表与克里斯提议的有点不同。

\"
\\
\/
\b
\f
\n
\r
\t
\u four-hex-digits

56
投票

以下是在为 JSON 创建字符串文字时可以转义的特殊字符列表:

 退格键(ASCII 代码 08)
换页(ASCII 代码 0C)

  新队

  回车符
标签
垂直标签
\' 撇号或单引号
\" 双引号
\ 反斜杠字符

参考:字符串文字

其中一些比其他更可选。例如,无论您转义制表符还是保留制表符文字,您的字符串都应该完全有效。不过,您当然应该处理反斜杠和引号字符。


17
投票

如官方 ECMA 规范第 9 节所述 (https://www.ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf) 在 JSON 中,必须转义以下字符:

  • U+0022
    "
    ,引号)
  • U+005C
    \
    ,反斜杠或反斜线)
  • U+0000
    U+001F
    (ASCII 控制字符)

此外,为了在 HTML 中安全地嵌入 JSON,还必须转义以下字符:

  • U+002F
    /
  • U+0027
    '
  • U+003C
    <
  • U+003E
    >
  • U+0026
    &
  • U+0085
    (下一行)
  • U+2028
    (行分隔符)
  • U+2029
    (段落分隔符)

上述一些字符可以使用标准中定义的以下短转义序列进行转义:

  • \"
    代表引号字符(U+0022)。
  • \\
    表示反斜线字符(U+005C)。
  • \/
    表示固相线字符 (U+002F)。
  • \b
    代表退格字符(U+0008)。
  • \f
    表示换页符(U+000C)。
  • \n
    表示换行符(U+000A)。
  • \r
    代表回车符(U+000D)。
  • \t
    表示字符制表字符(U+0009)。

需要转义的其他字符将使用

\uXXXX
表示法,即
\u
后跟编码代码点的四个十六进制数字。

\uXXXX
也可以用来代替短转义序列,或者选择性地从基本多语言平面 (BMP) 中转义任何其他字符。


5
投票

我马上就可以看出,至少 HTML 标签中的双引号会成为一个问题。这些可能是您需要转义才能使其成为有效 JSON 的全部内容;只需更换即可

"

\"

对于输出用户输入文本,您需要确保通过 HttpUtility.HtmlEncode() 运行它,以避免 XSS 攻击,并确保它不会破坏页面的格式。


5
投票

来自规格

除了必须转义的字符外,所有字符都可以放在引号内:引号 (U+0022)、反斜线 [反斜杠] (U+005C) 和控制字符 U+0000 到 U+001F

仅仅因为例如Bell (U+0007) 没有单字符转义码并不意味着您不需要转义它。使用 Unicode 转义序列

\u0007


4
投票

JSON 参考指出:

 任何 Unicode 字符-
     除了-"-或-\-或-
     控制字符

然后列出标准转义码:

 \" 标准 JSON 引用
  \ 反斜杠(转义字符)
  \/ 正斜杠
  退格键(ascii 代码 08)
  换页(ascii 代码 0C)
  
 新队
  
 回车符
  水平制表符
  \u 四位十六进制数字

由此我假设我需要转义所有列出的内容,而所有其他内容都是可选的。如果您愿意,您可以选择将所有字符编码为

\uXXXX
,或者您只能编码任何不可打印的 7 位 ASCII 字符或 Unicode 值不在
\u0020 <= x <= \u007E
范围
(32 - 126)
范围内的字符。最好先执行标准字符以获得更短的转义码,从而获得更好的可读性和性能。

此外,您可以从 RFC 4627 中阅读第 2.5 点(字符串)。

您可能(或可能不)想要(进一步)转义其他字符,具体取决于您嵌入 JSON 字符串的位置,但这超出了本问题的范围。

© www.soinside.com 2019 - 2024. All rights reserved.