Json.NET SerializeObject escape-значения для предотвращения XSS
Использование Json.NET
JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" })
возвращает
{"Property":"<script>alert('o hai');</script>"}
Возможно ли, чтобы значение было экранировано с помощью SerializeObject, чтобы предотвратить выполнение недружественного script? Я бы предпочел не вносить изменения в сам объект.
Изменить: в идеале я хотел бы интегрировать санитацию в вызов SerializeObject без необходимости обрабатывать объект до или после SerializeObject.
Изменить: строка, выводимая из JsonConvert.SerializeObject
, присваивается глобальной переменной в блоке script, который, по моему мнению, является причиной проблемы XSS.
Ответы
Ответ 1
Это может быть не идеальным, но это мое решение (на данный момент, по крайней мере):
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)
Ответ 2
Функциональность для достижения этого была добавлена в версии 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, но должна помочь вам немного смягчить ее в соответствии с вашим примером.
Ответ 3
Нет, JSON.NET - это сериализатор JSON. Это не дезинфицирующее средство XSS. Вы можете ознакомиться с библиотекой AntiXSS от Microsoft. Здесь статья о MSDN об использовании (немного устарела, но по-прежнему актуальна).