我有一个返回 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 库,只是自己构建字符串。
看看 http://json.org/。它声称的转义字符列表与克里斯提议的有点不同。
\"
\\
\/
\b
\f
\n
\r
\t
\u four-hex-digits
以下是在为 JSON 创建字符串文字时可以转义的特殊字符列表:
退格键(ASCII 代码 08) 换页(ASCII 代码 0C) 新队 回车符 标签 垂直标签 \' 撇号或单引号 \" 双引号 \ 反斜杠字符
参考:字符串文字
其中一些比其他更可选。例如,无论您转义制表符还是保留制表符文字,您的字符串都应该完全有效。不过,您当然应该处理反斜杠和引号字符。
如官方 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) 中转义任何其他字符。
我马上就可以看出,至少 HTML 标签中的双引号会成为一个问题。这些可能是您需要转义才能使其成为有效 JSON 的全部内容;只需更换即可
"
与
\"
对于输出用户输入文本,您需要确保通过 HttpUtility.HtmlEncode() 运行它,以避免 XSS 攻击,并确保它不会破坏页面的格式。
来自规格:
除了必须转义的字符外,所有字符都可以放在引号内:引号 (U+0022)、反斜线 [反斜杠] (U+005C) 和控制字符 U+0000 到 U+001F
仅仅因为例如Bell (U+0007) 没有单字符转义码并不意味着您不需要转义它。使用 Unicode 转义序列
\u0007
。
JSON 参考指出:
任何 Unicode 字符- 除了-"-或-\-或- 控制字符
然后列出标准转义码:
\" 标准 JSON 引用 \ 反斜杠(转义字符) \/ 正斜杠 退格键(ascii 代码 08) 换页(ascii 代码 0C) 新队 回车符 水平制表符 \u 四位十六进制数字
由此我假设我需要转义所有列出的内容,而所有其他内容都是可选的。如果您愿意,您可以选择将所有字符编码为
\uXXXX
,或者您只能编码任何不可打印的 7 位 ASCII 字符或 Unicode 值不在 \u0020 <= x <= \u007E
范围 (32 - 126)
范围内的字符。最好先执行标准字符以获得更短的转义码,从而获得更好的可读性和性能。
此外,您可以从 RFC 4627 中阅读第 2.5 点(字符串)。
您可能(或可能不)想要(进一步)转义其他字符,具体取决于您嵌入 JSON 字符串的位置,但这超出了本问题的范围。