安全组件在https上发出“安全”黑洞错误

时间:2014-08-26 18:55:31

标签: php security cakephp ssl cakephp-2.4

刚刚移动了服务器,现有代码现在显示出一个奇怪的问题。

代码的要点是捕获'安全'黑洞错误,并将其重定向到该页面的安全版本。它是在旧服务器上进行的,但现在表现得很奇怪。

// App Controller

public function beforeFilter() {
    $this->Security->blackHoleCallback = 'blackhole';
}

public function blackhole($type) {
    switch($type) {
        case 'secure':
            debug(Router::url($this->here, true));
            exit;
            $this->redirect('https://' . env('SERVER_NAME') . $this->here);
            break;
    }
}

调试显示:“http://www.example.com/

但我的浏览器显示“https://www.example.com/”(注意S)

3 个答案:

答案 0 :(得分:1)

更好的答案是根本不使用此功能。

您不应该在代码中重定向到HTTPS。您应该使用Strict-Transport-Security。这仍然涉及重定向,但它还涉及设置额外的标题。

您可以使用mod_ssl的功能:

SSLOptions +StrictRequire
SSLRequireSSL

请注意,SSLRequireSSL指令将拒绝所有未启用SSL的请求。

正常重定向:

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

这基本上重写了使用HTTPS作为403重定向的请求。

您还想设置Strict-Transport-Security标题:

Header set Strict-Transport-Security "max-age=8640000;includeSubdomains"

完成了。无需使用Cake。在服务器级别处理它,因为它是服务器级别。这意味着没有错误的请求甚至可以进入......

答案 1 :(得分:0)

我在这里找到了类似问题的答案:How can I securely detect SSL in CakePHP behind an nginx reverse proxy?

添加request detector

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

我的应用现在可以正确检测HTTPS。

答案 2 :(得分:-1)

public function beforeFilter() {
  $this->Security->blackHoleCallback = 'blackhole';
  $this->Security->requireSecure();
}