web-dev-qa-db-ja.com

なぜJsonRequestBehaviorが必要なのですか?

なぜJson Request Behaviorが必要なのですか?

HttpGetリクエストを自分のアクションに制限したい場合は、[HttpPost]属性でアクションを装飾することができます。

例:

[HttpPost]
public JsonResult Foo()
{
    return Json("Secrets");
}

// Instead of:
public JsonResult Foo()
{
    return Json("Secrets", JsonRequestBehavior.AllowGet);
}

[HttpPost]が不十分なのはなぜですか?
フレームワークが私たちが持っているすべてのJsonResultに対してJsonRequestBehavior.AllowGetで私たちを "バグ"させるのはなぜでしょう。 getリクエストを拒否したい場合はHttpPost属性を追加します。

353
gdoron

MVCはデフォルトでDenyGetを使用して、JSON要求を含む非常に特殊な攻撃からユーザーを保護し、HTTP GETエクスポージャーを許可することの影響がそれらの発生を許可する前に考慮される可能性を高めます。

遅すぎる可能性がある場合、これはその後反対されます。

注意:あなたのアクションメソッドが機密データを返さない場合は、getを許可しても安全です。

私のWrox ASP.NET MVC3本からさらに読む

既定では、ASP.NET MVCフレームワークでは、JSONペイロードを使用してHTTP GET要求に応答することはできません。 GETに応答してJSONを送信する必要がある場合は、Jsonメソッドの2番目のパラメータとしてJsonRequestBehavior.AllowGetを使用して、動作を明示的に許可する必要があります。ただし、悪意のあるユーザーがJSONハイジャックと呼ばれるプロセスを通じてJSONペイロードにアクセスする可能性があります。 GETリクエストでJSONを使用して機密情報を返したくない場合。詳しくは、Philの投稿を参照してください。 http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ または このSO投稿

Haack、Phil(2011)。プロフェッショナルASP.NET MVC 3(Wroxプログラマーからプログラマー)(Kindle Locations 6014-6020)。ロックス。キンドル版。

関連するStackOverflowの質問

ほとんどの最近のブラウザ(Firefox 21、Chrome 27、またはIE 10以降)では、これ以上の脆弱性はありません。

263
danludwig

自分で簡単にできるようにするために、actionfilterattributeを作成することもできます。

public class AllowJsonGetAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var jsonResult = filterContext.Result as JsonResult;

        if (jsonResult == null)
            throw new ArgumentException("Action does not return a JsonResult, 
                                                   attribute AllowJsonGet is not allowed");

        jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;            

        base.OnResultExecuting(filterContext);
    }
}

そしてあなたの行動にそれを使う

[AllowJsonGet]
public JsonResult MyAjaxAction()
{
    return Json("this is my test");
}
52
Arjen de Mooij

デフォルトではJsonresult "Deny get"

以下のような方法があるとします

  [HttpPost]
 public JsonResult amc(){}

デフォルトでは "Deny Get"です。

下記の方法で

public JsonResult amc(){}

Getgetを許可または使用する必要がある場合は、JsonRequestBehavior.AllowGetを使用する必要があります。

public JsonResult amc()
{
 return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}
7
Deepakmahajan

AllowJsonGetAttributeをmvc-controllersに適用できるようにすることで@Arjen de Mooijの回答を少し改善しました(個々のアクションメソッドだけではありません)。

using System.Web.Mvc;
public sealed class AllowJsonGetAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuted(ActionExecutedContext context)
    {
        var jsonResult = context.Result as JsonResult;
        if (jsonResult == null) return;

        jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var jsonResult = filterContext.Result as JsonResult;
        if (jsonResult == null) return;

        jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        base.OnResultExecuting(filterContext);
    }
}
5
XDS

あなたはそれを必要としません。

あなたのアクションがHttpPost属性を持っているなら、あなたはJsonRequestBehaviorを設定することを気にする必要はなく、それなしでオーバーロードを使う必要はありません。 JsonRequestBehavior列挙型を使わないで各メソッドのオーバーロードがあります。どうぞ:

JsonRequestBehaviorなし

protected internal JsonResult Json(object data);
protected internal JsonResult Json(object data, string contentType);
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding);

JsonRequestBehaviorで

protected internal JsonResult Json(object data, JsonRequestBehavior behavior);
protected internal JsonResult Json(object data, string contentType, 
                                   JsonRequestBehavior behavior);
protected internal virtual JsonResult Json(object data, string contentType, 
    Encoding contentEncoding, JsonRequestBehavior behavior);
2
CodingYoshi