如何在nginx反向代理后面的CakePHP中安全地检测SSL?

Aar*_*ock 8 php ssl cakephp reverse-proxy nginx

CakePHP(我见过的所有版本)都会检查$_SERVER['HTTPS']是否通过HTTPS而不是普通HTTP发出了请求.

我使用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;
}
Run Code Online (Sandbox Code Playgroud)

然后在nginx配置中,我习惯proxy_set_header X-Forwarded-Proto https;将标志添加到负载均衡器和后端应用程序服务器之间的任何请求.

这非常合适,但是任何向应用服务器发出直接请求的人都可能会欺骗他们认为他们正在浏览SSL而不是.我不确定这是否存在安全隐患,但这似乎不是一个好主意.

这是安全隐患吗?什么是更好的解决方案?

由于使用X-Forwarded-Proto似乎是标准的东西,解决方案可能是提交到CakePHP核心的一个很好的补丁,所以我认为任何答案都可以合法地涉及编辑核心文件.

小智 2

mod_rpaf会让你这样做。

这将根据 nginx 发送的标头将 Apache 中的 HTTPS 值设置为“on”,以便 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>
Run Code Online (Sandbox Code Playgroud)