ken*_*eiv 27 .net c# json json.net
使用Json.NET
JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" })
Run Code Online (Sandbox Code Playgroud)
回报
{"Property":"<script>alert('o hai');</script>"}
Run Code Online (Sandbox Code Playgroud)
是否有可能通过SerializeObject转义值以防止恶意脚本执行?我宁愿不对对象本身进行更改.
编辑:理想情况下,我想将清理集成到SerializeObject调用中,而不必在SerializeObject之前或之后处理对象.
编辑:字符串输出来自JsonConvert.SerializeObject脚本块中的全局变量,我相信这是XSS问题所在.
Joh*_*rin 41
版本4.5.11中添加了实现此功能
这允许您向输出添加各种类型的转义.
这是我的LinqPad测试:
var settings = new JsonSerializerSettings();
settings.StringEscapeHandling = StringEscapeHandling.EscapeHtml;
var output = JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" }, settings);
Debug.Print(output);
Run Code Online (Sandbox Code Playgroud)
输出
{"Property":"\u003cscript\u003ealert(\u0027o hai\u0027);\u003c/script\u003e"}
Run Code Online (Sandbox Code Playgroud)
就像免责声明一样,这不是修复xss的金银子,但应该根据你的例子帮助你减轻它.
ken*_*eiv 17
这可能不太理想,但这是我的解决方案(至少目前为止):
JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" }, new HtmlEncodeStringPropertiesConverter());
Run Code Online (Sandbox Code Playgroud)
使用一个简单的JsonConverter,如果它是一个字符串,则对该值执行HtmlEncode
public class HtmlEncodeStringPropertiesConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(Encoder.HtmlEncode(value.ToString()));
}
}
Run Code Online (Sandbox Code Playgroud)
(Encoder是Microsoft.Security.Application.Encoder从AntiXSS库)
在 .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);
Run Code Online (Sandbox Code Playgroud)
输出
// .NETCoreApp,Version=v3.0
{"Property":"\u003Cscript\u003Ealert(\u0027o hai\u0027);\u003C/script\u003E"}
Run Code Online (Sandbox Code Playgroud)
How to serialize and deserialize JSON in .NET in Serialization behavior section 说:
另请检查JavaScriptEncoder.UnsafeRelaxedJsonEscaping的备注,因为它包含一系列以不同默认值开头的备注。
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);
Run Code Online (Sandbox Code Playgroud)
{"Property":"<script>alert('o hai');</script>"}
Run Code Online (Sandbox Code Playgroud)
UnsafeRelaxedJsonEscaping的文档备注为UnsafeRelaxedJsonEscaping:
与默认编码器不同,此编码器实例不会转义 HTML 敏感字符,例如 <、>、&。因此,必须谨慎使用;例如,如果输出数据位于内容类型已知且字符集设置为 UTF-8 的响应中,则可以使用它。
与默认编码不同,引号被编码为 " 而不是 \u0022。
与默认编码(仅允许 UnicodeRanges.BasicLatin)不同,使用此编码器实例允许 UnicodeRanges.All 不转义。
与默认编码器不同,此编码器实例允许其他一些字符(例如“+”)不转义,因此必须谨慎使用。