在 .NET Core 3.0 中,System.Text.Json.JsonSerializer 默认转义 html 字符。
var text = "<script>alert('o hai');</script>";
var json = System.Text.Json.JsonSerializer.Serialize(new { Property = text });
Console.WriteLine(json);
输出
// .NETCoreApp,Version=v3.0
{"Property":"\u003Cscript\u003Ealert(\u0027o hai\u0027);\u003C/script\u003E"}
文档
How to serialize and deserialize JSON in .NET 在序列化行为部分说:
default encoder 转义非 ASCII 字符、ASCII 范围内的 HTML 敏感字符以及必须根据 the JSON spec 转义的字符。
请同时查看JavaScriptEncoder.UnsafeRelaxedJsonEscaping 的备注,因为它包含一系列以Unlike the Default 开头的备注。
我不想逃避它
JavaScriptEncoder.UnsafeRelaxedJsonEscaping 需要设置为关闭默认行为。
var options = new System.Text.Json.JsonSerializerOptions() {
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
var json2 = System.Text.Json.JsonSerializer.Serialize(new { Property = text }, options);
Console.WriteLine(json2);
{"Property":"<script>alert('o hai');</script>"}
UnsafeRelaxedJsonEscaping的文档
Remarks 为UnsafeRelaxedJsonEscaping:
与默认编码器不同,此编码器实例不会转义 HTML 敏感字符,例如 、&。因此,必须谨慎使用;例如,如果输出数据在内容类型已知且字符集设置为 UTF-8 的响应中,则可以使用它。
与默认编码不同,引号被编码为 " 而不是 \u0022。
与默认编码(仅允许 UnicodeRanges.BasicLatin)不同,使用此编码器实例允许 UnicodeRanges.All 不转义。
与默认编码器不同,此编码器实例允许某些其他字符(例如“+”)不转义,因此必须谨慎使用。