Подтвердить что ты не робот

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.

4b9b3361

Ответ 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 об использовании (немного устарела, но по-прежнему актуальна).