web-dev-qa-db-ja.com

JsonRequestBehaviorをAllowGetに設定すると、どの「機密情報」が開示される可能性がありますか

returning Json(組み込みMVC JsonResult helperを使用)のときに、ブラウザーのアドレスバーから新しいURLをテストするたびに、同じ古いエラーが発生します。

GET requestで機密情報が使用されると、機密情報が第三者のWebサイトに開示される可能性があるため、このリクエストはブロックされました。 GET requestsを許可するには、JsonRequestBehaviorAllowGetに設定します。

確認にうなり声を上げてFiddlerを起動してリクエストを送信するのではなく、今回は、GETリクエストがPOSTリクエストではないことを明らかにするのは何なのか疑問に思っています。

105
A. Murray

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)の新しいバージョンでは、既知の問題ではありません。

74
SilverlightFox

あなたのリターンで次を使用してください:

return this.Json("you result", JsonRequestBehavior.AllowGet);
104
OldTrain

デフォルトでは、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を使用しない理由について

53

JsonオブジェクトをMVCアプリケーションからクライアントに返したい場合、オブジェクトを返すときにJsonRequestBehavior.AllowGetを明示的に指定する必要があります。結果として、私は問題を克服するために以下のようにjsonデータを返します:

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);
7
Loc Huynh

次のように、Json ResponseにJsonRequestBehavior.AllowGetを使用する必要があります。

return Json(YourObject, JsonRequestBehavior.AllowGet);
6
keivan kashani