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;
}
然后在 nginx 配置中,我习惯proxy_set_header X-Forwarded-Proto https;
将标志添加到负载均衡器和后端应用程序服务器之间的任何请求中。
这工作得非常好,但是任何向应用服务器发出直接请求的人都可能欺骗他们,以为他们正在浏览 SSL,而实际上他们不是。我不确定这是否存在安全风险,但这似乎不是一个好主意。
是否存在安全风险?更好的解决方案是什么?
由于 usingX-Forwarded-Proto
似乎是一种标准,因此该解决方案可能是提交给 CakePHP 核心的一个很好的补丁,所以我认为任何答案都可以合法地涉及编辑核心文件。