web-dev-qa-db-ja.com

XSSを防ぐためのJson.NETSerializeObjectエスケープ値

Json.NETの使用

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

戻り値

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

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

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

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

28
kendaleiv

これを実現する機能が バージョン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を修正するための特効薬ではありませんが、例を挙げれば、それを少し軽減するのに役立つはずです。

38
John Perrin

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

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

EncoderMicrosoft.Security.Application.Encoder AntiXSSライブラリから)

17
kendaleiv

いいえ、JSON.NETはJSONシリアライザーです。 XSS消毒剤ではありません。 Microsoftの AntiXSS ライブラリをご覧ください。これが MSDNの記事 その使用法についてです(少し時代遅れですが、まだ関連しています)。

4
Darin Dimitrov