在 .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"}
文档
如何在 .NET中序列化和反序列化 JSON 在序列化行为部分中说:
默认编码器转义非 ASCII 字符、ASCII 范围内的HTML 敏感字符以及必须根据JSON 规范转义的字符。
还请检查JavaScriptEncoder.UnsafeRelaxedJsonEscaping的备注,因为它包含一系列以与 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
的文档
备注UnsafeRelaxedJsonEscaping
:_
与默认编码器不同,此编码器实例不会转义 HTML 敏感字符,例如 <、>、&。因此,必须谨慎使用;例如,如果输出数据在内容类型已知且字符集设置为 UTF-8 的响应中,则可以使用它。
与默认编码不同,引号被编码为 " 而不是 \u0022。
与默认编码(仅允许 UnicodeRanges.BasicLatin)不同,使用此编码器实例允许 UnicodeRanges.All 未经转义。
与默认编码器不同,此编码器实例允许其他一些字符(例如“+”)不转义,因此必须谨慎使用。