2012-04-23 16 views
9
  1. JSONPのコールバック関数とAJAXの成功コールバック関数との違いはわかりません。JSONPとAJAXの違いはわかりません

  2. #1では、基本的にどのように安全であるかはわかりません。

  3. AJAXとの擬似同一ドメイン制約の唯一の違いは何ですか?

  4. なぜAJAXはクロスドメイン要求を許可しないのですか。これがセキュリティホールを引き起こす可能性がある場合、攻撃はJSONPリクエストをXSSしませんか?

混乱、 マックス

答えて

17

AJAX呼び出しは、サーバーに直接クライアントからの実際のHTTPリクエストです。 Ajaxの呼び出しは、同期する(完了するまでブロックする)か、非同期にすることができます。同じ起源のセキュリティ保護のため、ターゲットサーバがCORSを使用してクロスオリジン要求を明示的に許可しない限り、ウェブページが来たのと同じサーバに対してのみajaxコールを行うことができます。

JSONP呼び出しは、クロスオリジン通信を可能にする<script>タグを使用した面白いハックです。 JSONP呼び出しでは、クライアントはスクリプトタグを作成し、URLにcallback=xxxxというクエリパラメータを指定してURLを設定します。そのスクリプト要求(スクリプトタグ挿入による)は、ブラウザによって外部サーバに送信されます。ブラウザはちょうどそれがいくつかのJavaScriptコードを要求していると思っています。サーバーはこの呼び出しのために特別なjavascriptを作成し、返されたときにブラウザによって実行されるjavascriptにサーバーはcallback=xxxxという名前の関数に関数呼び出しを行います。データをその関数に渡すことによって変数を定義することにより、サーバーはデータをクライアントに返信することができます。 JSONPでは、クライアントとサーバーの両方がJSONP呼び出しの動作方法とデータの定義方法に協力しなければなりません。クライアントは、JSONPを明示的にサポートしていないサーバーに対してJSONP呼び出しを行うことはできません。これは、JSONP応答の正確なタイプがサーバーによって構築されなければならないか、動作しないためです。

したがって、2つの通信方法は全く異なる働きをします。 ajax呼び出しだけが同期することができます。 <script>タグ挿入の性質上、JSONP呼び出しは常に非同期です。

Ajax呼び出しでは、応答がajaxイベントハンドラに戻ってきます。

JSONP呼び出しでは、返されたJavascriptがあなたの関数を呼び出すときに応答が返されます。

JSONPは、いくつかの点で、クロスオリジンセキュリティメカニズムをバイパスするセキュリティホールです。しかし、JSONPのようなメカニズムをサポートすることを明示的に選択したサーバーを呼び出すことができるので、サーバーがクロスオリジンを呼び出せないようにしたい場合は、JSONPをサポートしないことでサーバーを防ぐことができます。これらの他のサーバーに対しては、通常のajax呼び出しを行うことはできません。

ブラウザのメーカーは、このような抜け穴を本当に閉じることはできません。なぜなら、Webページの数が多すぎるとJSONPを使用したり、他のドメインのスクリプトを読み込んだりすることになるからです。たとえば、GoogleまたはMicrosoftのCDNからjQueryを使用するウェブ上のすべてのページは、ブラウザがクロスオリジンドメインからJavaScriptをダウンロードできないため、中断されます。

JSONPは、クロスオリジン要求を行うための回避策として発明されました。しかし、JSONPは動作させるために明示的なサーバーサポートが必要なので、実際にセキュリティ上の問題はありませんでした。JSONP呼び出しは、そのタイプのクロスオリジン呼び出しを許可することを明示的に決定したサーバーに対してのみ可能です。 JSONPはCORSがこれを制御/許可するよりエレガントな方法として発明されて以来、これまでよりもずっと少なく使用されています。 CORSはCross Origin Resource Sharingの略であり、ターゲットサーバがどのタイプのクロスオリジン要求が許可されているかをウェブブラウザに正確に伝え、どのウェブページドメインがそのような要求をすることを許可されているかを伝える手段を提供する。これはJSONPよりもはるかに細かい制御が可能で、現在のすべてのブラウザでCORSがサポートされています。

ここでは、クロスオリジンコールが問題を引き起こす例を示します。他のWebページから任意のWebページをロードしたり、任意のAjax呼び出しを行うことができたら、他のブラウザウィンドウでYahooのWebメールインターフェイスに既にログインしているとします。これは、ブラウザからの要求がYahooからデータを取得できるように、Cookieが設定されていることを意味します。他のウェブページのjavascriptが(自動的にあなたのクッキーが添付されている)Yahooにウェブメールリクエストをすることを許可されていれば、それはあなたのウェブメールデータをすべて取り出して自分のサイトに送り返すことができます。 1つのWebサイトで、他のWebサイトからログインしたすべてのデータを取り除くことができます。すべてのWebセキュリティが壊れるでしょう。

しかし、今日のように、Yahooは同じWebクッキーを使用するJSONPインターフェイスをサポートしていない限り、許可されていないJSONPリクエストからは安全です。基本的な違いがあることである

Why the cross-domain Ajax is a security concern?

Why Cross-Domain AJAX call is not allowed?

Why are cross-domain AJAX requests labelled as a "security risk"?

+0

返信いただきありがとうございます。しかし、私はあなたの反応に関するいくつかの質問があります。まず、「ajaxコールは実際のHTTPリクエストです」と言ったとき、JSONPを暗示していますか? 2つ目は、JSONPサーバーの応答が関数呼び出しでなければならない理由がわかりません。なぜなら、関数呼び出しを行うことができれば、何らかのステートメントを作成できなければならないからです。第三に、私はいつも

1

:ここ

は、クロスオリジンのAJAXとなぜそれがないようにしなければならないことの危険性についていくつかの他の良いwriteupsです何らかの理由で他のドメインにあるjavascriptファイル(スクリプトタグ経由)をロードするのはまったく問題ありませんが、デフォルトでは他のクロスドメインリソースを読み込むことはできません。

私はあなたと同じです、その描写はむしろ恣意的と思われます。 jQueryでは、JSONP呼び出しを行うと、スクリプトタグを作成し、リソースをロードし、jQueryライブラリはそのJSONP結果で定義された関数を呼び出してスクリプトを実行します。

私の目には、クロスドメインスクリプトの読み込みを許可することで、まだ広がっていないクロスドメインAJAXを許可することで導入された攻撃の追加のベクトルを考えることはできません。これはどこでも使用されている一般的な方法です(googleCDN、 、Googleアナリティクス、その他の無数のもの)。

wikipedia

In addition, many legacy cross-domain operations predating JavaScript are not subjected to same-origin checks; one such example is the ability to include scripts across domains, or submit POST forms.

+0

返事をありがとう。しかし、そうであれば、ブラウザは原点の制約を単純に取り除いてはいけませんか?セキュリティを低下させることはありませんが、開発をより簡単でより一貫性のあるものにすることができます。 – Max

+0

@MaxとNucleon - クロスオリジンajax呼び出しの大きな問題を記述した私の答えの最後の2つの段落を読んでいます。 – jfriend00

+0

@ jfriend00 CSRFについてのボブニスの答えは私に納得させました。リンクを投稿していただきありがとうございます! – Max

2

からJSONPのコールバックは実際のコールバックではありません。むしろ、JSONPはスクリプトインジェクションによって動作します。例えば、あなたがJSONP呼び出しを行いたい場合は、あなたがDOMに、このスクリプト要素を挿入します。

<script src="http://example.com/ajaxendpoint?jsonp=parseResponse"></script> 

サーバの応答は、このようなものになります。

parseResponse({"json":"value"}); 

それはでをを評価されますウィンドウのグローバルスコープしたがって、本質的にJSONPはリモートexec()のようなもので、実行するために作成する文字列をサーバーに通知します。

これは、Ajaxから非常に異なっている:JSONPで、応答は、スクリプトのグローバルスコープで評価あります。 XMLHttpRequestでは、レスポンスは文字列として受け取られ、評価されません。 (また、JSONPはGETでしか使用できませんが、AJAXでは任意のhttpメソッドを使用できます)。

したがって、2番目の問題では「基本的により安全です」まあ、あなたは正しいです、JSONPは実際には非常に安全ですです。サーバーはを返します。希望するスクリプトはとなります。何かが必要なものは

クロスドメインリクエストは、現在のページに関する情報を別のドメインのページに表示するために使用することができるため、安全ではありません。

あなたはXSS攻撃がJSONPだけを使用できるということは間違いありません。 CORSの目的はXSSを防止することではありません。

関連する問題