【问题标题】:Security Component giving 'secure' blackhole error, while on https安全组件在 https 上给出“安全”黑洞错误
【发布时间】:2014-08-26 18:55:30
【问题描述】:

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

代码的重点是捕捉“安全”黑洞错误,并将其重定向到该页面的安全版本。它在旧服务器上执行此操作,但现在表现得很奇怪。

// 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)

【问题讨论】:

  • “代码的重点是捕捉一个‘安全’黑洞错误……” - 请原谅我的无知……什么是安全黑洞错误?跨度>
  • @jww - 这意味着我告诉我的应用程序我想要求此页面是“安全的”(即 https),但它并没有这样识别它。这是一个 CakePHP 的东西。

标签: php security cakephp ssl cakephp-2.4


【解决方案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 合作。在服务器级别处理它,因为那是服务器级别。这意味着甚至没有错误的请求可以进入......

【讨论】:

  • 这个问题是我并不总是想强制 SSL。使用 Cake 的好处在于我可以指定哪些页面应该或不应该需要 SSL。另一个替代方案(我想?)是只抛出“需要 SSL”类型的错误页面而不是重定向。或者也许有一种使用 Cake 重定向的方法,它也设置了你所说的标题?
  • 为什么不总是想强制 SSL?在什么情况下您希望页面是非 SSL 的?这样做可能会暴露其他安全风险,因为如果传输不安全,会话令牌或其他信息可能会泄露。非 ssl 允许 MITM 攻击(中间人)。如果你不强制所有流量通过 SSL,那么 MITM 用户和服务器之间的通信是安全的,但客户端是不安全的,因为他们正在与 MITM 交谈,那么攻击是可能的。所以只需对所有事情都使用 SSL 并完成它:-)
  • 有效点 - 我想没有理由不使用所有 SSL。好吧 - 你赢了:)
  • “问题在于我并不总是想强制使用 SSL” - 只是重述 ircmaxell 的评论...在某些页面主题上使用 SSL/TLS所有页面都指向stripping attacks,其中 HTTPS 被具有特权网络位置的攻击者强制为 HTTP。并且不要与downgrade attacks 混淆,这是使用 SSL/TLS 时的不同攻击。但是你必须意识到这两种攻击。
  • “无需使用 Cake”,不幸的是,这并不完全正确。向 Apache 添加Header set Strict-Transport-Security "max-age=8640000;includeSubdomains" 没有任何区别,因为它没有为 PHP 脚本设置任何标头,而是将整个响应交给 PHP。因此,您确实需要在应用程序中设置该标头。
【解决方案2】:

我在这里的一个类似问题中找到了答案: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。

【讨论】:

  • 请仅在您知道事实您有代理的情况下才这样做。否则,您可能会为攻击者设置该标头的 MITM 打开一个漏洞。然后您认为通信是 SSL,因此您允许连接继续。但它是纯文本,允许攻击者读取发送的所有内容。
  • 注意:这可行,但 ircmaxell 提出了一些优点,并有一个替代/可能更好的解决方案。
【解决方案3】:
public function beforeFilter() {
  $this->Security->blackHoleCallback = 'blackhole';
  $this->Security->requireSecure();
}

【讨论】:

  • 它需要始终启用 SSL。
  • 它已经需要它,否则它一开始就不会遇到“安全”错误
  • ‘secure’ 表示 SSL 方法限制失败。因此它无法获取 https 并且您的安全类型被捕获。当您调试打印时,它会显示 http 方案并且您已重定向到 https。因此浏览器 URL 显示 https 方案。
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
相关资源
最近更新 更多