Экранирующие значения Json.NET SerializeObject для предотвращения XSS

Поскольку Java 1.5, да :

Pattern.quote("$5");

24
задан kendaleiv 25 May 2012 в 15:36
поделиться

3 ответа

Это может быть не идеально, но это мое решение (на данный момент, по крайней мере):

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)

17
ответ дан kendaleiv 25 May 2012 в 15:36
поделиться

Функциональность для достижения этой цели была добавлена ​​в версии 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, но она должна помочь вам смягчить ее немного приведенный твой пример.

37
ответ дан John Perrin 25 May 2012 в 15:36
поделиться

Нет, JSON.NET - это сериализатор JSON. Это не дезинфицирующее средство XSS. Вы можете взглянуть на библиотеку AntiXSS от Microsoft. Вот статья на MSDN о его использовании (немного устаревшая, но все еще актуальная).

4
ответ дан Darin Dimitrov 25 May 2012 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: