なぜ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
属性を追加します。
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以降)では、これ以上の脆弱性はありません。
自分で簡単にできるようにするために、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");
}
デフォルトでは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);
}
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);
}
}
あなたはそれを必要としません。
あなたのアクションが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);