7

domain.com/test2.phpという2つのファイルがあります。

<div id="testDiv"></div>

<script src="http://domain.com/packages/jquery.js"></script>
<script>$("#testDiv").load("http://domain.com/test3.php", {var1:1, var2:2});</script>

およびdomain.com/test3.php:

<b>var1: <?php echo $var1; ?> , var2: <?php echo $var2; ?></b>

この場合、domain.com var1: 1 , var2: 2/ test2.phpは期待どおりに出力されますが、サブドメインでtest2.phpを作成するとします。クロスドメインスクリプティングの問題を防ぐために、sub.domain.com/test2.phpの先頭に次の行を追加します。

<script>document.domain = "domain.com";</script>

この余分な行は、クロスドメインエラーの表示を停止しますが、ファイルは出力しなくなりますvar1: 1 , var2: 2。これはなぜですか、どうすれば修正できますか?

4

1 に答える 1

12

このdocument.domainメカニズムは、クライアントからサーバーへの通信ではなく、フレーム間のクライアント側の通信を可能にすることを目的としています。からのページを含む1つのフレームと、からのページをexample.com含む別のフレームがある場合、後者が例で示したように設定されfoo.example.comない限り、2つは互いのDOMにアクセスできません。document.domainexample.com

クロスドメインAJAXリクエストの最新の推奨メカニズムは、クロスオリジンリソースシェアリング(「CORS」)です。このメカニズムでは、クロスドメインリクエストが許可されていることを示す特別なHTTP応答ヘッダーをターゲットリソースに返す必要があります。シナリオではtest3.php、次のHTTP応答ヘッダーを返します。

Access-Control-Allow-Origin: sub.domain.com

PHPでは、次のようにこれを行います。

header("Access-Control-Allow-Origin: sub.domain.com");

このヘッダー値をに設定して、任意の*オリジンからのクロスドメインリクエストを許可することもできますが、これにより、管理していないサイトからのリクエストが許可されることに注意してください。

クライアント側のJavaScriptライブラリからのリクエストにはX-Requested-With、CORSで許可されている標準セットにない追加のヘッダーも含まれていることが多いため、追加の応答ヘッダーを介してこのヘッダーを明示的に許可する必要がある場合があります。

Access-Control-Allow-Headers: X-Requested-With

CORSは、最新のブラウザでのみサポートされています。古いブラウザの場合、一般的な規則はJSON-Pを使用することです。これは、あるサーバー上のページが別のサーバーからスクリプトファイルをロードして実行できるという事実を利用するトリックです。この手法では、ターゲットリソースがページ内の関数を呼び出す有効なJavaScriptプログラムである必要があるため、CORSほどエレガントでシームレスではありませんが、JavaScriptをサポートするすべてのブラウザーで機能するはずです。

于 2013-03-28T18:18:15.860 に答える