クロスオリジンリソースシェアリングをサポートしたいという要望で、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://を削除していますか?