3

私はそのような方法で ApiConroller を持っています:

[HttpGet]
public IEnumerable<MyValue> Values()
{
     return db.MyValues.ToList();
}

JSON 配列を返します。jQuery を使用して結果を取得します。その配列がハイジャックされないようにするにはどうすればよいですか?

4

2 に答える 2

8

一般的な方法でそれを行うことができます。

次のクラスを追加します。

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"
        }
    ]
}
于 2013-01-13T23:36:28.077 に答える
3

結果をオブジェクトにラップするだけです。

   return new { values = db.MyValues.ToList() };

JavaScriptオブジェクトは有効なスクリプトではないため、Haackがhttp://haacked.com/archive/2009/06/24/json-hijacking.aspxで説明しているように、これにより結果が悪意を持って実行されるのを防ぎます。

于 2013-01-13T17:34:45.707 に答える