2013-03-19 17 views
13

私たちは、ローカルで実行しているサーバーへのAJAXリクエストを投稿しているの起源ヘッダを付加クロム、すなわち同一生成元の要求

xhr.open("POST", "http://localhost:9000/context/request"); 
xhr.addHeader(someCustomHeaders); 
xhr.send(someData); 

このJavaScriptはまた、ローカルホストから提供されている実行されていることのページ:9000、つまり、これは完全に同じ起源要求のように見えます。

しかし、何らかの理由でGoogle Chromeが結果のリクエストにOriginヘッダーを常に設定しているため、サーバーはCORSリクエストであるという誤った仮定に基づいてリクエストをブロックします。

これはFirefoxでは発生しません。

また、FirefoxもChromeもOPTIONSプリフライトリクエストを送信していません。これは混乱します。最初にプリフライトせずにOriginヘッダーを設定して、Originヘッダーとカスタムヘッダーがサーバーで許可されていることを確認するのはなぜですか?

誰でもこの場合に起こっていることを知っていますか? CORSの仕様を誤解していますか?

+0

http://seclab.stanford.edu/websec/csrf/csrf.pptを参照してください。これは、Originヘッダーが同じ起点のPOST要求に適している理由を示しています。これはCSRFの保護メカニズムです。 – user239558

答えて

22

クロムとサファリには、同じオリジンPOST/PUT/DELETE要求に同じOriginヘッダーが含まれています(同じオリジンGETリクエストにはオリジンヘッダーがありません)。 Firefoxには同じオリジンリクエストにOriginヘッダーが含まれていません。ブラウザーは、CORSヘッダーの有無にかかわらず、同じ起点要求に対する応答がユーザーに送信されるように、同じ起点要求でCORS応答ヘッダーを期待しません。

Hostヘッダーを確認し、Originヘッダーのドメインと一致する場合は、CORSとして処理しないでください。 Hostが唯一のドメインとポートを持つことになりながらOriginは、スキーム(HTTP/HTTPS)、ドメインとポートを持っていることを

Host: example.com 
Origin: http://example.com 

注:ヘッダーには、このような何かを見て。 RFC 6454によると

+0

これはかなり意味があります - 私たちはCORSフィルターを変更します。ありがとう! –

13

- ウェブ起源コンセプト - 起源の存在は、同一生成元の要求を含む、任意のHTTPリクエストのため、実際に法的です:

http://tools.ietf.org/html/rfc6454#section-7.3

「ユーザーエージェントは任意のHTTP 要求にOriginヘッダーフィールドを含めるかもしれません。

関連する問題