CakePHP (私が確認したすべてのバージョン)$_SERVER['HTTPS']
は、プレーンな HTTP ではなく HTTPS 経由でリクエストが行われたかどうかを確認します。
私は nginx をロード バランサーとして使用しており、その背後には Apache アプリケーション サーバーがあります。SSL 接続はロードバランサーで終了するため、$_SERVER['HTTPS']
CakePHP に関する限り、 は設定されていません。
アプリ サーバーで HTTPS を安全に検出する方法を見つけたいと考えています。
これまでのところ、これを CakePHP 構成に入れました。
$request_headers = getallheaders();
if ( (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']) || ( isset($request_headers['X-Forwarded-Proto']) && $request_headers['X-Forwarded-Proto'] == 'https' ) ) {
$ssl = true;
// overwrite environment vars (ugly) since CakePHP won't honour X-Forwarded-Proto
$_SERVER['HTTPS'] = 'on';
$_ENV['HTTPS'] = 'on';
} else {
$ssl = false;
}
そして、nginx の構成ではproxy_set_header X-Forwarded-Proto https;
、ロード バランサーとバックエンド アプリケーション サーバー間のすべてのリクエストにフラグを追加していました。
これは問題なく機能しますが、アプリ サーバーに直接リクエストを送信すると、SSL 経由ではないのに、SSL 経由でブラウジングしていると思わせる可能性があります。これがセキュリティ上のリスクかどうかはわかりませんが、良い考えではないようです。
それはセキュリティリスクですか?より良い解決策は何ですか?
を使用することは標準のX-Forwarded-Proto
ように思えるので、解決策は CakePHP コアに提出するのに適したパッチになる可能性があるため、コア ファイルの編集も合法的に行うことができると思います。