切换协议时,Laravel会话无效(https为http或http为https)

时间:2014-06-11 06:00:01

标签: php laravel laravel-4

我目前正在开发一个应用程序,我必须使用SSL保护几页。例如,登录,注册页面。但是,当协议在httpshttp之间切换时,Laravel会话不会通过HTTP传输。

是否有任何解决方案,Laravel将保留两个协议的会话。

2 个答案:

答案 0 :(得分:4)

默认情况下,Laravel为auth和会话cookie设置安全和/或httponly。我找不到在配置中更改此功能的方法,并且在Laravel 4.0中实际上 (现在不再是这种情况),将httponly硬编码为vendor/laravel/framework/src/Illuminate/Session/SessionManager.php中的设置

请注意,您不应该将Cookie从HTTPS泄漏到HTTP,因为它会阻止您保持会话安全(例如,我仍然可以从我网络上登录到您网站的其他用户嗅探会话)。

Laravel 4.1 +

修改app/config/session.php。如果您希望在https上设置cookie,也可以将'secure'键更改为false。

或者,按照@ martinstoeckli的建议,根据环境的价值设置密钥。

Laravel 4.0

实现这一点的最佳方法可能是用您自己的处理程序替换CookieSessionHandler

例如,可以创建一个新类,它将使用更新的写入函数扩展CookieSessionHandler,该函数会将所有cookie标记为仅用于https / http。

Class NewCookieSessionHandler extends CookieSessionHandler implements \SessionHandlerInterface {
    /**
     * {@inheritDoc}
     */
    public function write($sessionId, $data)
    {
        // $this->cookie is \Illuminate\Cookie\CookieJar
        $this->setCookie($this->cookie->make($sessionId, $data, $this->minutes, '/', false, false));
    }

    /**
     * Set the given cookie in the headers.
     *
     * @param  \Symfony\Component\HttpFoundation\Cookie  $cookie
     * @return void
     */
    protected function setCookie($cookie)
    {
        if (headers_sent()) return;

        setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), false, false);
    }

}

然后在app/config/session.php内,您可以将驱动程序更改为NewCookie

最后在app/start/global.php内注册新的cookie驱动程序,覆盖设置cookie

use Illuminate\Cache\Repository;

Cookie::extend('NewCookie', function($app)
{
    return new NewCookieSessionHandler;
});

答案 1 :(得分:3)

这不仅是Laravel的问题。您必须确定包含session-id的cookie是否仅限于HTTPS,或者是否也将其发送到HTTP页面。

  • 如果cookie仅限于HTTPS页面,则不会发送 浏览器到不安全的HTTP请求。在这种情况下,你将松开 切换到HTTP页面时的会话。
  • 如果将cookie发送到HTTPS和HTTP页面,攻击者可以读取session-id,从而在用户可以收听HTTP请求时模拟用户。 cookie不仅会发送html请求,还会发送每个图片和其他资源请求。

配置可以在\app\config\session.php文件中找到,名为secure。如果你想只在现场网站上设置为true(但不是为了开发),你可以这样写:

'secure' => App::environment('production'),

要解决此问题,您必须分解两个问题,维护会话和身份验证。我用示例代码写了一篇关于这个主题的小article。请记住,当您在协议之间切换时,您总是容易受到SSL条带攻击,因此您可能会考虑在整个网站上使用 HTTPS 。对于今天的服务器来说,这应该不再是问题了。