returning Json
(組み込みMVC JsonResult helper
を使用)のときに、ブラウザーのアドレスバーから新しいURL
をテストするたびに、同じ古いエラーが発生します。
GET request
で機密情報が使用されると、機密情報が第三者のWebサイトに開示される可能性があるため、このリクエストはブロックされました。GET requests
を許可するには、JsonRequestBehavior
をAllowGet
に設定します。
確認にうなり声を上げてFiddlerを起動してリクエストを送信するのではなく、今回は、GET
リクエストがPOST
リクエストではないことを明らかにするのは何なのか疑問に思っています。
WebサイトにGetUser
webメソッドがあるとします。
http://www.example.com/User/GetUser/32
jSONレスポンスを返します:
{ "Name": "John Doe" }
このメソッドがPOSTリクエストのみを受け入れる場合、AJAXリクエストがPOSTを使用してhttp://www.example.com/User/GetUser/32
に行われた場合にのみ、コンテンツがブラウザに返されます_ 方法。 CORS を実装していない限り、ブラウザはあなたにこのリクエストを行う他のドメインからのデータを保護することに注意してください。
ただし、GETリクエストを許可し、POSTではなくGETで上記と同様のAJAXリクエストを行うと、悪意のあるユーザーはscript
タグを使用して自分のサイトのコンテキストにJSONを含めることができますHTMLで。例えばwww.evil.com
:
<script src="http://www.example.com/User/GetUser/32"></script>
このJavaScriptはwww.evil.com
には役に立たないはずです。なぜなら、Webメソッドによって返されたオブジェクトを読み取る方法がないはずだからです。ただし、ブラウザの古いバージョン(Firefox 3など)のバグにより、JavaScriptプロトタイプオブジェクトを再定義し、メソッドによって返されたデータをwww.evil.com
が読み取れるようにすることが可能です。これはJSONハイジャックと呼ばれます。
これを防ぐためのいくつかの方法については this post をご覧ください。ただし、最新のブラウザー(Firefox、Chrome、IE)の新しいバージョンでは、既知の問題ではありません。
あなたのリターンで次を使用してください:
return this.Json("you result", JsonRequestBehavior.AllowGet);
デフォルトでは、ASP.NET MVCフレームワークでは、JSONハイジャックと呼ばれるプロセスを介して悪意のあるユーザーがペイロードにアクセスできる可能性があるため、GETリクエストにJSONペイロードで応答することはできません。 GETリクエストでJSONを使用して機密情報を返したくない場合。
GETへの応答としてJSONを送信する必要があり、機密データを公開しない場合は、Json
メソッドの2番目のパラメーターとしてJsonRequestBehavior.AllowGet
を渡すことで、動作を明示的に許可できます。
といった
[HttpGet] //No need to decorate, as by default it will be GET
public JsonResult GetMyData(){
var myResultDataObject = buildMyData(); // build, but keep controller thin
// delegating buildMyData to builder/Query Builder using CQRS makes easy :)
return Json(myResultDataObject, JsonRequestBehavior.AllowGet);
}
Phil Haackの興味深い記事があります JSON Hijacking
GETメソッドでJsonを使用しない理由について
JsonオブジェクトをMVCアプリケーションからクライアントに返したい場合、オブジェクトを返すときにJsonRequestBehavior.AllowGetを明示的に指定する必要があります。結果として、私は問題を克服するために以下のようにjsonデータを返します:
return Json(yourObjectData, JsonRequestBehavior.AllowGet);
次のように、Json ResponseにJsonRequestBehavior.AllowGetを使用する必要があります。
return Json(YourObject, JsonRequestBehavior.AllowGet);