3

クロスオリジンリソースシェアリングをサポートしたいという要望で、AJAXリクエストを処理するRESTfulJSONエンドポイントがあります。クロスサイトリクエストフォージェリ(CSRF)攻撃について心配する必要がないように、物事をロックダウンしています。私たちが使用しているアプローチの一部は、Originヘッダーの存在をチェックし、承認されたOriginのホワイトリストに含まれていることを確認することです。ただし、一部のブラウザ(ChromeとSafari)には、同じドメインから発信された場合でも(CORSリクエストではない)、AJAXPOSTリクエストを含むOriginヘッダーが含まれていることがわかりました。

ユーザーがRESTエンドポイントの提供元と同じドメインをホワイトリストに登録する必要がないようにするため、特定のリクエストが「同じドメイン」か「クロスオリジン」かを自動的に判断したいと思います。これを行うには、現時点で最善の試みは、Originヘッダーの存在を監視し、存在する場合は、それをHostヘッダーの値と比較することです。オリジンがホストと一致する場合、このリクエストは「同じドメイン」である必要があるため、ホワイトリストでオリジンを確認する必要はありません。

これを実現するために使用することを検討しているサーバー側のJSコードのスニペットを次に示します。

     if (typeof (headers["Origin"]) !== "undefined" &&
         headers["Origin"].replace(new RegExp("^.*?//"), "") !== headers["Host"] &&
         !contains(allowedOrigins, headers.Origin) ) {
         return false;
     } else {
         return true;
     }

Originヘッダーは次のようになるため、正規表現の比較が必要です。

http://localhost:8080

Hostヘッダーは次のようになります。

localhost:8080

だから私はその正規表現を使って先頭のhttp://を取り除きます。

問題は、このアプローチを使用または議論している他の実装が見られないことです。これは、何らかの理由で、これが適切な方法ではない可能性があることを懸念しています。したがって、問題は、リクエストが同じドメインから発信されているかどうかを判断するための安全な方法として、HostヘッダーとOriginヘッダーを比較することです。

また、ホストに関連して常に適切な値を生成することを示したように、Originから主要なprotocol://を削除していますか?

4

2 に答える 2

3

代わりに、Ajaxヘッダーを確認することをお勧めします:X-Requested-With:XMLHttpRequest

同一生成元のAjaxはカスタムヘッダーを追加でき、jQueryなどのほとんどすべての一般的なフレームワークはX-Requested-With:XMLHttpRequestを追加します。

ただし、CORSの場合、カスタムヘッダーはフライト前のHTTPOPTIONSリクエストを引き起こします。

したがって、プリフライトなしでX-Requested-With:XMLHttpRequest(またはその他のカスタムヘッダー)が表示された場合、それが同一生成元のAjax呼び出しであることがわかります。

于 2013-01-29T16:59:04.117 に答える
0

同じオリジンを決定するためにホストヘッダーとオリジンヘッダーを比較する現在のアプローチは、今後HTTPSに切り替えたい場合、またはクロスプロトコルリクエストの場合に言うことができる場合は失敗します。

あなたのコードがこれらの2つの起源を同じように扱うように。

Origin : http://www.example.com Origin : https://example.com

他のアプローチは、HTTPリファラーヘッダーを使用することです。しかし、なりすましは不可能な作業ではないため、私はそれを使用することを好みません。

私の提案は、後悔するよりも安全にプレイする方が良いでしょう。許可されたオリジンのリストにアイテムを追加しても、それほど苦痛はありません。

于 2013-01-30T12:43:38.097 に答える