2011-01-06 3 views
51

このエラーはMVCアプリでランダムに発生します。ときどき同じことをすることも時々ありません。誰かがこれが単純な修正になる可能性のあるものと関係があるかどうか、あるいはこれがあなたの多くが見ている共通のものかどうかを知っていますか?Json allowget error

System.InvalidOperationException: This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet. 
    at System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext context) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.b__11() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.b__13() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.b__13() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.b__13() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
    at System.Web.Mvc.Controller.ExecuteCore() 
    at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) 
    at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.b__4() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.b__0() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.b__7(IAsyncResult _) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

答えて

118

質問はスタックトレースにありました。 「AllowGetにJsonRequestBehavior」

だからとしてあなたのコントローラでそれを使用します。

return Json(data, JsonRequestBehavior.AllowGet) 
+27

ような何かを、私は周りに行くと盲目的に伝えること間違いかもしれないと思う[HttpPost]とし、クライアントにあなたのJSONのアクションに注釈を付けることができますAllowGetが無効になっているというセキュリティ上の理由を無視します。 - 代わりに$ .postを実行してデータを取得し、問題全体を回避することは難しいことではありません。 – Yablargo

+11

良い点。懸念している人のために、Haackはこれをカバーする素晴らしい記事を持っています:http://haacked.com/archive/2009/06/25/json-hijacking.aspx –

+2

Haackの記事は現在http://haacked.com/archive/にあります。 2009/06/24/json-hijacking.aspx/ –

4

あなたがいつかHTTP GETあたりのコントローラのアクションを呼び出すようです。 JSONを返すことができるようにするには、あなたが

return Json(data, JsonRequestBehavior.AllowGet); 
22

のようなコードを使用する必要があり、その結果これらのセキュリティコントロールをバイパスする前にhttp://haacked.com/archive/2009/06/24/json-hijacking.aspx/をお読みください。

HTTP POSTに応答してJSONデータのみを公開すると、この攻撃に対して脆弱ではありません。

あなたは単に

$.post('/blag/JSON', function (data) { 
     //do something with my json data object here 

}); 
+3

JSONデータを受け取ろうとするときにGETリクエストを受け入れることは、まったく合理的です。 POSTは、新しいレコードを作成するためのものである必要があります。 GETリクエストは、状態に影響を与えないデータを取得するためのものでなければなりません。 – ashurexm

+1

上記のJsonRequestBehavior.AllowGetソリューションが存在する理由は、開発者がこの保護を意図的にバイパスするようにするためです。投稿を使用することの提案は、このデータを第三者に公開する設計/実装の欠陥を回避することです。これは、スタックトレースの最初の行にも表示されます。System.InvalidOperationException:このリクエストは、GETリクエスト**で使用される場合、機密情報がサードパーティのWebサイトに公開される可能性があるためブロックされました。 GETリクエストを許可するには、JsonRequestBehaviorをAllowGetに設定します。 – Yablargo

-1

return Json(PartialView("index").ToJsonObject(this), JsonRequestBehavior.AllowGet);