30

Json.NET の使用

JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" })

戻り値

{"Property":"<script>alert('o hai');</script>"}

悪意のあるスクリプトの実行を防ぐために、SerializeObject によって値をエスケープすることは可能ですか? オブジェクト自体に変更を加えたくないのです。

編集: 理想的には、SerializeObject の前後にオブジェクトを処理することなく、サニタイズを SerializeObject 呼び出しに統合したいと考えています。

編集: からの文字列出力JsonConvert.SerializeObjectは、スクリプト ブロック内のグローバル変数に割り当てられます。これは、XSS の問題がある場所だと思います。

4

4 に答える 4

18

これは理想的ではないかもしれませんが、これは私の解決策です(少なくとも今のところ):

JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" }, new HtmlEncodeStringPropertiesConverter());

文字列の場合、値に対してHtmlEncodeを実行する単純なJsonConverterを使用します

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()));
    }
}

(AntiXSSライブラリからのものですEncoderMicrosoft.Security.Application.Encoder

于 2012-05-29T18:15:14.520 に答える
4

いいえ、JSON.NET は JSON シリアライザーです。XSS サニタイザーではありません。Microsoft のAntiXSSライブラリを参照してください。これは、その使用法に関する MSDNの記事です (少し古いですが、まだ関連があります)。

于 2012-05-25T14:30:47.900 に答える