json
メソッドでGet
を返すときに、次のASP.NET MVCエラーに遭遇しました。
機密情報がGETリクエストで使用されると、サードパーティのWebサイトに開示される可能性があるため、このリクエストはブロックされました。 GETリクエストを許可するには、JsonRequestBehaviorをAllowGetに設定します。
どうやらこの脆弱性はjson Hijackingと呼ばれています。 この記事 は、json
を使用してGet
を返すときにWebサイトが悪用される可能性があることを説明しています。ただし、json
メソッドでPost
を返すのは安全です。
Get
をPost
に変更すると、なぜこの攻撃を防ぐことができるのですか?
スクリプト、画像、スタイルシート、フォントを含むWebページでネットワークパネルを開くと、それらすべてのリクエストがGET
HTTPメソッドを使用して行われていることがわかります。たとえば、これは<script>
タグによってロードされたファイルのリクエストがどのように見えるかです。
そして、これは<img>
タグによってロードされたファイルの例です。
ブラウザは、あなたが何をしているかを知っているどこからでもそのようなリソースをロードしている場合、あなたがそれをフェッチすることを盲目的に信頼します(そうでなければ、CDNのようなものが機能しません) XHRリクエスト!
XHRリクエスト(fetch
呼び出しを含む)はCORSポリシーに照らしてチェックされます。それが何であるかはご存知だと思います。 JavaScriptは、別のドメイン(またはポートなど)に存在するリソースに対してXHRリクエストを行うことができません。
したがって、2種類のリクエストポリシーがあります。
img
、script
、link
などを使用してロードしたものは、CORSポリシーに対してチェックされませんが、GET
HTTPリクエストのみ。また、ブラウザはすべてのCookieを送信します。この場合、最も重要なのは認証のCookieです。つまり、GET
を使用してJSON配列を提供している場合は、script
タグを使用して、どのドメインを使用していてもフェッチすることができます。次に、記事に記載されているトリックを使用して、配列を実行して(奇妙に聞こえますがはい)、機密情報を取得できます。
POST
を使用する場合、攻撃者はscript
リクエストを使用してリソースをフェッチするため、GET
(またはその他の)タグを使用してこのリクエストを実行する方法はありません。 。
あなたはと思うかもしれませんが、form
を使用してそれを行うことができます!しかし、同じCORSの問題が発生します。 form
を送信するだけの場合、JSONデータは現在のページに読み込まれ、スクリプトがページに存在しないため、攻撃者がそれを取得する方法はありません。
ああ、私はform
ターゲットをiframe
!に設定するだけですが、JavaScriptではそのiframe
。
それは理にかなっていますか?
JSONはGET
として返すべきではありません。攻撃者からの<script>
の挿入によりデータが盗まれる可能性があるためです(たとえば、動的コンテンツがHTMLエスケープされずに読み込まれる場合)。スクリプトはGET
メソッドを介してサーバーから要求されるため、POST
を使用してサーバーから送信されたものは、挿入されたスクリプトから実行されません。スクリプトが実行されると、ハッカーはログインしたCookieを使用してJSONにアクセスできますが、JSONはこれを許可されるべきではありません。
JSONハッキングの脆弱性の詳細については、 この記事 および this SO answer を参照してください。