Это может быть не идеально, но это мое решение (на данный момент, по крайней мере):
JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" }, new HtmlEncodeStringPropertiesConverter());
с простым 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()));
}
}
(Encoder
- Microsoft.Security.Application.Encoder
из библиотеки AntiXSS)
Функциональность для достижения этой цели была добавлена в версии 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);
выводит
{"Property":"\u003cscript\u003ealert(\u0027o hai\u0027);\u003c/script\u003e"}
Так же, как отказ от ответственности, это не золотая пуля, чтобы исправить xss, но она должна помочь вам смягчить ее немного приведенный твой пример.
Нет, JSON.NET - это сериализатор JSON. Это не дезинфицирующее средство XSS. Вы можете взглянуть на библиотеку AntiXSS от Microsoft. Вот статья на MSDN о его использовании (немного устаревшая, но все еще актуальная).