Json.NETの使用
JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" })
戻り値
{"Property":"<script>alert('o hai');</script>"}
敵対的なスクリプトの実行を防ぐために、SerializeObjectによって値をエスケープすることは可能ですか?オブジェクト自体に変更を加えたくないのですが。
編集:理想的には、SerializeObjectの前後にオブジェクトを処理することなく、サニタイズをSerializeObject呼び出しに統合したいと思います。
編集:JsonConvert.SerializeObject
から出力された文字列は、スクリプトブロック内のグローバル変数に割り当てられます。これがXSSの問題であると私は信じています。
これを実現する機能が バージョン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を修正するための特効薬ではありませんが、例を挙げれば、それを少し軽減するのに役立つはずです。
これは理想的ではないかもしれませんが、これは私の解決策です(少なくとも今のところ):
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()));
}
}
(Encoder
はMicrosoft.Security.Application.Encoder
AntiXSSライブラリから)