同一生成元ポリシー
JavaScript や ActionScript などのクライアント側プログラミング言語では、同一生成元ポリシーは非常に重要なセキュリティ概念であり、データのセキュリティを確保する上で非常に重要です。同一生成元ポリシーでは、クロスドメインスクリプトは、あるドメインのスクリプトが別のドメインのほとんどのプロパティとメソッドにアクセスして操作できないことが規定されています。では、同じドメインとは何で、異なるドメインとは何でしょうか? 2 つのドメインが同じプロトコル (http など)、同じポート (80 など)、および同じホスト (www.example.org など) を持っている場合、それらは同じドメインであると見なされます。たとえば、http://www.example.org/index.html と http://www.example.org/sub/index.html は同じドメイン内にありますが、http://www.example.org、https ://www .example.org、http://www.example.org:8080、http://sub.example.org のいずれか 2 つがクロスドメインを構成します。同一生成元ポリシーは、ファイル プロトコルでのスクリプトのアクセス許可の制限など、いくつかの特殊な状況にも対応する必要があります。ローカル HTML ファイルは、ファイル プロトコルを介してブラウザで開かれます。スクリプトがファイル プロトコルを介してハード ディスク上の他のファイルにアクセスできる場合、現時点では、IE8 には依然としてそのようなリスクが発生します。
同一生成元ポリシーの影響を受け、クロスドメインのリソース共有は制限されます。しかし、人々の実践とブラウザの進歩により、現在、クロスドメインリクエストのスキルには多くの貴重な経験が蓄積されています。ここでは、クロスドメインのリソース共有を 2 つのタイプに分けます。1 つは一方向のデータ要求で、もう 1 つは双方向のメッセージ通信です。次に、いくつかの一般的なクロスドメイン メソッドをリストします。次のクロスドメインの例のソース コードは、ここから入手できます。
一方向のクロスドメイン
JSONP
JSONP (JSON with Padding) はシンプルで効率的なクロスドメイン メソッドであり、HTML の script タグは他のドメインから JavaScript をロードして実行できるため、script タグを通じて他のドメインからリソースを動的にロードできます。たとえば、ドメイン A のページ pageA からドメイン B のデータを読み込みたい場合、ドメイン B のページ pageB で、pageA に必要なデータを JavaScript 形式で宣言し、script タグを使用します。 pageA から pageB をロードし、次に pageB でスクリプトが実行されます。 JSONP はこれに基づいてコールバック関数を追加します。pageB がロードされた後、pageA で定義された関数が実行され、必要なデータがパラメーターの形式で関数に渡されます。 JSONP は実装が簡単ですが、サードパーティのスクリプトが任意に実行されると、ページのコンテンツが改ざんされ、機密データが傍受される可能性があります。ただし、信頼できる当事者間でデータを転送する場合、JSONP は非常に適切な選択肢です。
Flash URLローダー
Flash には、独自のセキュリティ ポリシーのセットがあり、サーバーは、crossdomain.xml ファイルを使用して、どのドメイン SWF ファイルにアクセスできるかを宣言することもできます。また、SWF は、どのドメインでロードできるかを決定することもできます。ドメイン www.a.com からドメイン www.b.com 上のデータをリクエストするなど、ドメインを越えてリソースにアクセスする場合、Flash を使用して HTTP リクエストを送信できます。まず、ドメイン www.b.com の Crossdomain.xml を変更し (手動で作成する必要がない場合は、通常はルート ディレクトリに保存されます)、www.a.com をホワイトリストに追加します。次に、HTTP リクエストが Flash URLLoader を通じて送信され、最後に応答結果が Flash API を通じて JavaScript に渡されます。 Flash URLLoader は非常に一般的なクロスドメイン ソリューションですが、iOS をサポートする必要がある場合、このソリューションでは何もできません。
アクセス制御
アクセス コントロールは、より超越的なクロスドメイン メソッドであり、現在、クロスドメイン HTTP リクエストを送信できるブラウザはいくつかのみです (Firefox、Google Chrome などは XMLHTTPRequest を通じて実装され、IE8 は XDomainRequest を通じて実装されます)。 ) リクエストへの応答には、リクエストされたドメインのアクセス可能性を宣言する Access-Control-Allow-Origin HTTP 応答ヘッダーが含まれている必要があります。たとえば、 www.a.com がクロスドメイン HTTP リクエストをwww.b.comのasset.php に送信すると、asset.php は次の応答ヘッダーを追加する必要があります。
header("Access-Control-Allow-Origin: http://www.a.com");