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

slwdgvem  于 2023-11-20  发布在  其他
关注(0)|答案(6)|浏览(121)

我有一个ASP.NETMVC操作返回一个JSON对象。
JSON:

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

字符串
目前我的HTML是打破它。将有用户生成的文本在输出字段,所以我必须确保我转义所有需要转义的东西。
有没有人列了一张我需要逃跑的东西的清单?
我没有使用任何JSON库,只是自己构建字符串。

djmepvbi

djmepvbi1#

看一下http://json.org/,它声明的转义字符列表与Chris提出的有点不同。

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

字符串

yh2wf1be

yh2wf1be2#

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

\b  Backspace (ASCII code 08)
\f  Form feed (ASCII code 0C)
\n  New line
\r  Carriage return
\t  Tab
\v  Vertical tab
\'  Apostrophe or single quote
\"  Double quote
\\  Backslash character

字符串
引用:String literals
其中一些是可选的。例如,你的字符串应该是完全有效的,无论你是转义制表符还是保留制表符文字。你当然应该处理反斜杠和引号字符。

n8ghc7c1

n8ghc7c13#

正如JSON中的ECMA官方规范(https://www.ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf)第9节所解释的那样,以下字符必须进行转义:

  • U+0022",引号)
  • U+005C\,反斜线或反实线)
  • U+0000U+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)中转义任何其他字符。

xvw2m8pv

xvw2m8pv4#

马上,我可以告诉你,至少HTML标签中的双引号是一个问题。

"

字符串

\"


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

hrysbysz

hrysbysz5#

关于spec
所有字符都可以放在引号内,但必须转义的字符除外:引号(U+0022)、反实线[反斜杠](U+005C)和控制字符U+0000到U+001F
例如Bell(U+0007)没有单字符转义码并不意味着你不需要转义它。使用Unicode转义序列\u0007

ttisahbt

ttisahbt6#

JSON引用声明:

any-Unicode-character-
     except-"-or-\\-or-
     control-character

字符串
然后列出标准转义码:

\" Standard JSON quote
  \\ Backslash (Escape char)
  \/ Forward slash
  \b Backspace (ascii code 08)
  \f Form feed (ascii code 0C)
  \n Newline
  \r Carriage return
  \t Horizontal Tab
  \u four-hex-digits


从这里我假设我需要转义所有列出的字符,而所有其他的都是可选的。如果您愿意,可以选择将所有字符编码为\uXXXX,或者你只能做任何不可打印的7-位ASCII字符或Unicode值不在\u0020 <= x <= \u007E范围(32 - 126)内的字符。最好先使用标准字符,以获得较短的转义码,从而提高可读性和性能.
此外,您还可以从RFC 4627读取点2.5(字符串)。
您可能(也可能不)希望(进一步)转义其他字符,具体取决于JSON字符串的嵌入位置,但这超出了本问题的范围。

相关问题