20

プロジェクトのために、私はさまざまな HTML5 および Javascript 要素とそれらの周りのセキュリティを調べており、今 CORS について頭を悩ませようとしています。

私のテストに基づいて、削除すると..

<?php
 header("Access-Control-Allow-Origin: *"); 
 header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
 ?>

..アクセスしようとしているページから、Chrome のコンソール ログに次のように表示されます。

XMLHttpRequest cannot load http://www.bla.com/index.php. Origin http://bla2.com is not allowed by Access-Control-Allow-Origin.

これが正しいことは理解していますが、Wireshark は戻り値に HTTP/1.1 200 OK を示し、データには要求されているページのソースが表示されます。実際に転送されたとしても、responseText が実質的な方法で使用されるのをブロックしているのは、ブラウザと Javascript だけですか?

コードは次のとおりです。

  function makeXMLRequest() {
  xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4) {
        alert(xmlhttp.responseText);
    }
}
xmlhttp.open("GET","http://www.bla.com/index.php",true);
xmlhttp.send();
}

前もって感謝します。

4

2 に答える 2

39

GET や POST のような「単純な」HTTP 動詞の場合、はい、ページ全体が取得され、ブラウザは JavaScript がコンテンツを使用するかどうかを決定します。サーバーは、リクエストの送信元を知る必要はありません。サーバーからの応答を検査し、JS がコンテンツの表示を許可されているかどうかを判断するのはブラウザーの仕事です。

PUT や DELETE などの「単純ではない」HTTP 動詞の場合、ブラウザは OPTIONS リクエストを使用して「プリフライト リクエスト」を発行します。その場合、ブラウザーは最初にドメイン動詞がサポートされているかどうかを確認するためAccess-Control-Allow-OriginAccess-Control-Allow-Methods、それぞれ と をチェックします。(詳細については、HTML5 RocksのCORS ページの「 Handling a Not-So-Simple Request」を参照してください。)プリフライト応答には、 .Access-Control-Allow-Headers

これは、クライアントが DELETE リクエストをサーバーに送信できるようにすることは、たとえ JavaScript がクロスドメインの結果を見ることができなくても、非常に悪い可能性があるためです。正当なドメインからのものです (ただし、リクエストのヘッダーを使用してそうする場合があります)。Origin

于 2012-11-15T15:40:07.143 に答える
6

実際に転送されたとしても、responseText が実質的な方法で使用されるのをブロックしているのは、ブラウザと Javascript だけですか?

はい。JS で好きなリクエストを行うことができます。

同一オリジン ポリシーによって防止されるのは、データへのアクセスです。

悪意のあること (「POST http://bank.example/give/money?to=attacker」や「 」など) を行うリクエストはCSRF 攻撃POST http://forum.example.com/post?message=spamspamspamspam"と呼ばれ、サーバーによって防御する必要があります。

于 2012-11-15T15:25:30.097 に答える