JsonRequestBehaviorをAllowGetに設定するときに開示できる「機密情報」


112

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

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

今回は、承認でうなり声を上げてFiddlerを起動して投稿リクエストを実行するのではなく、GETリクエストが公開POSTしないのがリクエストであるとはどういうことなのでしょうか。

回答:


82

あなたのウェブサイトにGetUserウェブメソッドがあるとしましょう:

http://www.example.com/User/GetUser/32

JSON応答を返します。

{ "Name": "John Doe" }

このメソッドがPOST要求のみを受け入れる場合http://www.example.com/User/GetUser/32、POSTメソッドを使用してAJAX要求が行われた場合にのみ、コンテンツがブラウザーに返されます。CORSを実装していない限り、ブラウザはこのリクエストを自分のドメインに送信している他のドメインからデータを保護します。

ただし、GETリクエストを許可し、POSTではなくGETを使用して上記と同様のAJAXリクエストを作成した場合、悪意のあるユーザーがscriptHTMLのタグを使用して、自分のサイトのコンテキストにJSONを含める可能性があります。例www.evil.com

<script src="http://www.example.com/User/GetUser/32"></script>

www.evil.comWebメソッドによって返されたオブジェクトを読み取る方法がないため、このJavaScriptは役に立たないはずです。ただし、古いバージョンのブラウザー(Firefox 3など)のバグにより、JavaScriptプロトタイプオブジェクトを再定義www.evil.comして、メソッドから返されたデータを読み取ることが可能になっています。これはJSONハイジャックとして知られています。

これを防ぐいくつかの方法については、この投稿を参照してください。ただし、最近のブラウザー(Firefox、Chrome、IE)の新しいバージョンでは、これは既知の問題ではありません。


25
いい投稿ですが、コントローラに[Authorize]タグを含めれば、セキュリティについて心配する必要はありません。このコードが誰かJson(returnMsg、JsonRequestBehavior.AllowGet)を助けることを願っています
Dhanuka777

17
@ Dhanuka777:残念ながら真実ではありません。リクエストに認証に必要なCookieが被害者のマシンからのものとして含まれているため、メソッドに副作用がある場合、CSRF攻撃が可能になる可能性がありますwww.example.com/User/DeleteUser/32[Authorize]非常に古いブラウザの場合も、ここで説明する攻撃からあなたを救うことはありません-それはユーザー自身がアクセスしているwww.evil.comため、リクエストwww.evil.comwww.example.com認証Cookieを含みます。
SilverlightFox 2014

1
また、アクションに副作用がある場合は、GETメソッドを使用して呼び出さないでください。データを読み取るためだけにGETを使用するのが慣例であり、副作用のある操作はすべてPOST、PUT、DELETEなどを使用する必要があります。つまり、私はこの「機密情報」エラーメッセージは誤解を招くものだと考えてください。開発者がGETメソッドをその本来の使用方法で使用する場合、すべて問題ありません。:)
ps_ttf 2016年

1
それがどのような違いをもたらすのか、私にはわかりません。投稿とは異なり、取得するよりも保護または暗号化されます。それはまだプレーンテキストです。任意のツールを使用して投稿するのと同じくらい簡単にリクエストを送信でき、それでも同じプレーンテキスト情報を取得できます。悪意のあるユーザーは、自分のサイトにサーバー側のコードを簡単に記述して、投稿を行うこともできます。
computrius、2017年

1
@Castrohenge:いいえ。これは、スクリプトsrcのGETリクエストでは送信されないヘッダーを設定する必要があるためです。
SilverlightFox

111

あなたの帰りに、以下を使用してください:

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

7
これは実際にOPの質問にどのように答えますか?この答えはありませんすべてが例外を回避するにはどのようにTELL皆..です
eaglei22

2
うん、それを使う。空のキャッチでキャッチしようとするようなものだ。このリスクを使用しないでください(リスクを理解する前に)。-1'd
2017

6
少なくとも結果を説明せずにセキュリティ警告を無視するように人々に伝えるのは無責任です。-1
エドゥアルドワダ

58

ASP.NET MVCフレームワークでは、悪意のあるユーザーがJSONハイジャックと呼ばれるプロセスを通じてペイロードにアクセスできる可能性があるため、JSONペイロードでGETリクエストに応答することはできません。GETリクエストでJSONを使用して機密情報を返したくない場合。

GETへの応答としてJSONを送信する必要があり、機密データを公開しない場合はJsonRequestBehavior.AllowGet、2番目のパラメーターとしてJson メソッドに渡すことにより、動作を明示的に許可できます。

といった

  [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);
  }

JSON HijackingGETメソッドでJsonを使用しない理由についてのPhil Haackの興味深い記事は次のとおりです


2
素晴らしいポスト。HTTPSを使用するべき正当な理由。
pqsk 2015

6
HTTPSはここでは役に立たないと思います。
ショーンマクミラン2017

10

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

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);

7

次のようなJson応答にはJsonRequestBehavior.AllowGetを使用する必要があります。

return Json(YourObject, JsonRequestBehavior.AllowGet);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.