我目前正在开发一个应用程序,我必须使用SSL
来确保几个页面的安全。例如,登录,注册页面。但是,当协议在https
到http
之间切换时,Laravel会话不通过HTTP传输。Laravel会话在切换协议(https到http或http到https)时不工作(https到http或http到)
有没有解决办法,Laravel会保持这两个协议的会话。
我目前正在开发一个应用程序,我必须使用SSL
来确保几个页面的安全。例如,登录,注册页面。但是,当协议在https
到http
之间切换时,Laravel会话不通过HTTP传输。Laravel会话在切换协议(https到http或http到https)时不工作(https到http或http到)
有没有解决办法,Laravel会保持这两个协议的会话。
默认情况下,Laravel正在为auth和会话cookie设置安全性和/或httponly。我无法找到一种方式,配置进行更改,并在Laravel 4.0 INFACT (这不再是这种情况),中HTTPOnly被硬编码为vendor/laravel/framework/src/Illuminate/Session/SessionManager.php
注意,你不应该从泄露的cookie设置HTTPS转换为HTTP,因为它阻止了您保持会话安全(例如,我仍然可以嗅探登录到您网站的网络上的其他用户的会话)。
编辑app/config/session.php
。如果您希望在https上设置Cookie,也可以在http上阅读,请将'secure'
键更改为false。
另外,遵循@ martinstoeckli的建议,并根据您的环境的价值设置密钥。
可能实现,这将是有自己的处理程序,以取代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;
});
这不仅与Laravel问题的新的cookie的驱动程序。您必须决定包含session-id的cookie是仅限于HTTPS,还是将其发送到HTTP页面。
该配置可以在\app\config\session.php
文件中找到并且被称为secure
。如果你想将它设置为true,仅在活动网站(而不是开发),你可以写这样的事情:
'secure' => App::environment('production'),
为了解决这个问题,你就必须拆分两个问题,维护会话和认证。我用示例代码编写了一个关于此主题的小型article。请记住,当您在协议之间切换时,您总是容易受到SSL条形攻击,因此您可能会考虑在整个站点中使用HTTPS 。对于今天的服务器来说,这不应该成为一个问题了。
不错的文章马丁。 – Anam
在app/config/session.php'secure'=> false'?你有编辑它? –
我的配置文件没有这样的东西。但是,我会尝试。 – Anam
@pleasedeleteme无法正常工作。 – Anam