9

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 コアに提出するのに適したパッチになる可能性があるため、コア ファイルの編集も合法的に行うことができると思います。

4

3 に答える 3

3

リクエスト検出器を追加する

コアは編集しないでください。あなたの意図がパッチを提出することであるなら、それが受け入れられるまであなたのパッチに頼らないでください- さもなければ、CakePHP の分岐と独自のフォークを維持する道を進んでいます.

正確な実装ロジックを決定したら、リクエスト検出器を使用してそれを受け入れることができます。

例えば:

//AppController::beforeFilter
public function beforeFilter() {
    $this->request->addDetector('ssl', array(
        'env' => 'HTTP_X_FORWARDED_PROTO',
        'value' => 'https'
    ));
}

この後、カスタム ヘッダーは Cake によって ssl リクエストとして正しく識別されます。

グローバルのキーは、$_SERVERすべて大文字とアンダースコアで区切られて正規化されていることに注意してください。

$ curl --header "X-Forwarded-Proto:https" http:://yoursite.com

データが入力$_SERVER['HTTP_X_FORWARDED_PROTO']されます - そのため、これを確認することが重要です。

(イン) セキュリティの説明

はい、それはあなたが世話をする必要があるものです-ロードバランサーのIPを介してのみ応答するように、Webサーバーへの直接アクセスを無効にします; または、ヘッダーの値に関係なく、直接アクセス要求に対して true を返さないように検出器を変更します。X-Forwarded-Protoドキュメントに示されているように、環境変数の値を単にテストするのではなく、コールバックを使用して必要なロジックを実行できます。

于 2013-01-13T16:00:56.647 に答える
2

mod_rpafを使用すると、これを行うことができます。

これにより、nginx によって送信されたヘッダーに基づいて Apache の HTTPS 値が「オン」に設定されるため、Cake はそのままで (Apache で実行される他のアプリと同様に) 動作します。

また、REMOTE_ADDR、SERVER_PORT、および HTTP_HOST の値も修正します。

これが私の設定例です:

<IfModule mod_rpaf.c>
    RPAF_Enable       On
    RPAF_ProxyIPs     127.0.0.1 10.0.0.0/24
    RPAF_SetHostName  On
    RPAF_SetHTTPS     On
    RPAF_SetPort      On
</IfModule>

# If mod_rewrite redirects then we lose the HTTPS status to REDIRECT_HTTPS.
# This resets it back. This happens with Cake's front controller
<IfModule setenvif_module>
    SetEnvIf REDIRECT_HTTPS on HTTPS=on
</IfModule>
于 2013-11-14T08:59:59.367 に答える
1

AD7six のコメントを見つけました - redirect() 関数をオーバーライドします - 私のアプリには http へのリダイレクトがいくつかあったため、SSL のみの設定で非常に役立ちました。

AppController.phpリダイレクト機能が常にhttps を使用するように、以下を追加しました。

function redirect($url, $status = NULL, $exit = true) {
    return parent::redirect(str_replace('http://', 'https://', Router::url($url, true)));
}
于 2014-06-27T13:29:58.930 に答える