JSONPのコールバック関数がAJAXの成功コールバック関数とどのように違うのかわかりません。
#1を考えると、それが基本的にどのように安全であるかはわかりません。
では、AJAXとの人工的な同じドメインの制約の唯一の違いは何ですか?
AJAXがクロスドメインリクエストのみを許可できないのはなぜですか。これがセキュリティホールを引き起こす可能性がある場合、攻撃はXSSだけでJSONPリクエストではないでしょうか?
混乱した、マックス
JSONPのコールバック関数がAJAXの成功コールバック関数とどのように違うのかわかりません。
#1を考えると、それが基本的にどのように安全であるかはわかりません。
では、AJAXとの人工的な同じドメインの制約の唯一の違いは何ですか?
AJAXがクロスドメインリクエストのみを許可できないのはなぜですか。これがセキュリティホールを引き起こす可能性がある場合、攻撃はXSSだけでJSONPリクエストではないでしょうか?
混乱した、マックス
ajax 呼び出しは、クライアントから直接サーバーへの実際の HTTP 要求です。Ajax 呼び出しは、同期 (完了するまでブロック) または非同期にすることができます。同一オリジンのセキュリティ保護により、ターゲット サーバーが CORS を使用したクロス オリジン リクエストを明示的に許可しない限り、Ajax 呼び出しは Web ページの送信元と同じサーバーに対してのみ行うことができます。
<script>
JSONP 呼び出しは、クロスオリジン通信を可能にするタグを使用した興味深いハックです。JSONP 呼び出しでは、クライアントはスクリプト タグを作成し、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 呼び出しを行うことはできません。
ブラウザー メーカーは、この抜け穴を実際に閉じることはできません。なぜなら、そうすると、すでに JSONP を使用しているか、他のドメインからスクリプトをロードしている無数の Web ページが壊れてしまうからです。たとえば、Google または Microsoft CDN の jQuery を使用する Web 上のすべてのページは、ブラウザーがクロスオリジン ドメインから JavaScript をダウンロードすることを許可されないため、機能しなくなります。
JSONP は主に、クロスオリジン リクエストを作成できるようにするための回避策として考案されました。しかし、JSONP は機能するために明示的なサーバー サポートを必要とするため、JSONP 呼び出しは、そのタイプのクロス オリジン呼び出しを許可することを明示的に決定したサーバーに対してのみ行うことができるため、実際にはセキュリティ上の問題ではありませんでした。JSONP は、CORS がこれを制御/許可するためのより洗練された方法として発明されたため、以前よりもはるかに使用されなくなりました。CORS はCross Origin Resource Sharingの略で、ターゲット サーバーが Web ブラウザに許可されているクロス オリジン リクエストのタイプを正確に伝える手段を提供し、そのようなリクエストを行うことが許可されている Web ページ ドメインを伝える手段を提供します。JSONP よりもはるかに細かい制御が可能であり、最新のブラウザーはすべて CORS をサポートするようになりました。
クロスオリジン呼び出しがどのように問題を引き起こすかの例を次に示します。他の Web ページから任意の Web ページをロードしたり、任意の ajax 呼び出しを行うことができる場合、Yahoo の Web メール インターフェイスに他のブラウザー ウィンドウで既にログインしていると想像してください。これは、ブラウザからの要求が Yahoo からデータを取得できるように Cookie が設定されていることを意味します。他の Web ページの JavaScript が Yahoo に Web メール リクエストを送信することを許可されている場合 (これにより、Cookie が自動的に添付されます)、すべての Web メール データを取得して、独自のサイトに送り返すことができます。1 つの Web サイトが、他の Web サイトからすべてのログイン データを盗む可能性があります。すべての Web セキュリティが破られる可能性があります。
しかし、現在の方法では、Yahoo が同じ Web Cookie を使用する JSONP インターフェースをサポートしていない限り、許可されていない JSONP リクエストから保護されています。
クロスオリジン Ajax の危険性と、それを防止する必要がある理由について、他のいくつかの優れた記事を次に示します。
クロスドメイン Ajax がセキュリティ上の問題になるのはなぜですか?
JSONP のコールバックは実際のコールバックではありません。むしろ、JSONP はスクリプト インジェクションによって機能します。たとえば、JSONP 呼び出しを行う場合は、次のスクリプト要素を DOM に挿入します。
<script src="http://example.com/ajaxendpoint?jsonp=parseResponse"></script>
サーバーの応答は次のようになります。
parseResponse({"json":"value"});
ウィンドウのグローバル スコープで評価されます。したがって、本質的に JSONP は remoteexec()
のようなもので、サーバーは実行するために作成する文字列をアドバイスされます。
これはAjax とは大きく異なります。JSONP では、応答はスクリプトのグローバル スコープで評価されます。XMLHttpRequest では、応答は文字列として受信され、評価されません。(また、JSONP は GET でのみ使用できますが、AJAX は任意の http メソッドを許可します。)
したがって、2番目の問題については、「根本的に安全であるとは思えません。」そうです、JSONP は実際には非常に安全ではありません。サーバーは必要なスクリプトを返すことができ、ブラウザに対して必要なことを何でも行うことができます!
クロスドメイン リクエストは、現在のページに関する情報を別のドメインのページに開示するために使用できるため、安全ではありません。
そして、XSS 攻撃は JSONP を使用できることは正しいです。CORS の目的は、XSS を防止することではありません (ページで信頼できないスクリプトを実行している場合は、いずれにしても問題が発生します)。
基本的な違いは、何らかの理由で、他のドメインにある JavaScript ファイルを (script タグを介して) ロードすることはまったく問題ありませんが、デフォルトでは、他のクロスドメイン リソースをロードすることは許可されていないことです。
描写がかなり恣意的に見えるという点で、私はあなたと一緒です。ではjQuery
、JSONP 呼び出しを実行すると、効果的にスクリプト タグを作成してリソースをロードし、jQuery ライブラリはその JSONP 結果で定義された関数を呼び出してスクリプトを実行します。
私の目には、クロスドメイン AJAX を許可することによって導入される追加の攻撃ベクトルは考えられません。これは、クロスドメインスクリプトの読み込みを許可することによってまだ大きく広がっていません。これは、どこでも使用される一般的な方法です (googleCDN による jQuery、広告スクリプト、Google アナリティクス、他にも数え切れないほど)。
ウィキペディアより
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.