私はそのような方法で ApiConroller を持っています:
[HttpGet]
public IEnumerable<MyValue> Values()
{
return db.MyValues.ToList();
}
JSON 配列を返します。jQuery を使用して結果を取得します。その配列がハイジャックされないようにするにはどうすればよいですか?
私はそのような方法で ApiConroller を持っています:
[HttpGet]
public IEnumerable<MyValue> Values()
{
return db.MyValues.ToList();
}
JSON 配列を返します。jQuery を使用して結果を取得します。その配列がハイジャックされないようにするにはどうすればよいですか?
一般的な方法でそれを行うことができます。
次のクラスを追加します。
public class SecureJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, HttpContent content, TransportContext transportContext)
{
if ((typeof (IEnumerable).IsAssignableFrom(type)))
{
value = new {result = value};
}
return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
}
}
そして今、WebApiConfig でデフォルトJSonMediaTypeFormatter
を次の新しいものに置き換えます。
config.Formatters.RemoveAt(0);
config.Formatters.Insert(0, new SecureJsonMediaTypeFormatter());
これで、最初に行ったように、必要な IEnumerable を返すことができます。
[HttpGet]
public IEnumerable<MyValue> Values()
{
return db.MyValues.ToList();
}
はそれをインターセプトし、プロパティSecureJsonMEdiaTypeFormatter
の下の匿名オブジェクトにラップします。result
{
"result": [
{
"name": "Toronto Maple Leafs",
"league": "NHL"
},
{
"name": "Montreal Canadiens",
"league": "NHL"
}
]
}
結果をオブジェクトにラップするだけです。
return new { values = db.MyValues.ToList() };
JavaScriptオブジェクトは有効なスクリプトではないため、Haackがhttp://haacked.com/archive/2009/06/24/json-hijacking.aspxで説明しているように、これにより結果が悪意を持って実行されるのを防ぎます。