我目前正在开发一个应用程序,我必须使用SSL
保护几页。例如,登录,注册页面。但是,当协议在https
到http
之间切换时,Laravel会话不会通过HTTP传输。
是否有任何解决方案,Laravel将保留两个协议的会话。
答案 0 :(得分:4)
默认情况下,Laravel为auth和会话cookie设置安全和/或httponly。我找不到在配置中更改此功能的方法,并且在Laravel 4.0中实际上 (现在不再是这种情况),将httponly硬编码为vendor/laravel/framework/src/Illuminate/Session/SessionManager.php
中的设置
请注意,您不应该将Cookie从HTTPS泄漏到HTTP,因为它会阻止您保持会话安全(例如,我仍然可以从我网络上登录到您网站的其他用户嗅探会话)。
修改app/config/session.php
。如果您希望在https上设置cookie,也可以将'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驱动程序,覆盖设置cookie
use Illuminate\Cache\Repository;
Cookie::extend('NewCookie', function($app)
{
return new NewCookieSessionHandler;
});
答案 1 :(得分:3)
这不仅是Laravel的问题。您必须确定包含session-id的cookie是否仅限于HTTPS,或者是否也将其发送到HTTP页面。
配置可以在\app\config\session.php
文件中找到,名为secure
。如果你想只在现场网站上设置为true(但不是为了开发),你可以这样写:
'secure' => App::environment('production'),
要解决此问题,您必须分解两个问题,维护会话和身份验证。我用示例代码写了一篇关于这个主题的小article。请记住,当您在协议之间切换时,您总是容易受到SSL条带攻击,因此您可能会考虑在整个网站上使用 HTTPS 。对于今天的服务器来说,这应该不再是问题了。