2014-06-11 94 views
5

我目前正在开发一个应用程序,我必须使用SSL来确保几个页面的安全。例如,登录,注册页面。但是,当协议在httpshttp之间切换时,Laravel会话不通过HTTP传输。Laravel会话在切换协议(https到http或http到https)时不工作(https到http或http到)

有没有解决办法,Laravel会保持这两个协议的会话。

+1

在app/config/session.php'secure'=> false'?你有编辑它? –

+0

我的配置文件没有这样的东西。但是,我会尝试。 – Anam

+0

@pleasedeleteme无法正常工作。 – Anam

回答

3

默认情况下,Laravel正在为auth和会话cookie设置安全性和/或httponly。我无法找到一种方式,配置进行更改,并在Laravel 4.0 INFACT (这不再是这种情况),中HTTPOnly被硬编码为vendor/laravel/framework/src/Illuminate/Session/SessionManager.php

注意,你不应该从泄露的cookie设置HTTPS转换为HTTP,因为它阻止了您保持会话安全(例如,我仍然可以嗅探登录到您网站的网络上的其他用户的会话)。

Laravel 4.1+

编辑app/config/session.php。如果您希望在https上设置Cookie,也可以在http上阅读,请将'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

use Illuminate\Cache\Repository; 

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

你把这个类放在哪里'NewCookieSessionHandler'? – Anam

+0

你可以从任何地方加载图书馆/课程都可以,没有太大的需要。请注意,这是为了更老的laravel's。 – timgws

3

这不仅与Laravel问题的新的cookie的驱动程序。您必须决定包含session-id的cookie是仅限于HTTPS,还是将其发送到HTTP页面。

  • 如果cookie仅限于HTTPS页面,那么浏览器不会将其发送到不安全的HTTP请求。在这种情况下,当切换到HTTP页面时,您将丢失会话 。
  • 如果cookie发送到HTTPS和HTTP页面,攻击者可以读取会话标识并因此模拟用户,当他可以监听HTTP请求时。该cookie不仅会发送html请求,还会发送每个请求的图片和其他资源。

该配置可以在\app\config\session.php文件中找到并且被称为secure。如果你想将它设置为true,仅在活动网站(而不是开发),你可以写这样的事情:

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

为了解决这个问题,你就必须拆分两个问题,维护会话和认证。我用示例代码编写了一个关于此主题的小型article。请记住,当您在协议之间切换时,您总是容易受到SSL条形攻击,因此您可能会考虑在整个站点中使用HTTPS 。对于今天的服务器来说,这不应该成为一个问题了。

+0

不错的文章马丁。 – Anam