Symfony 4一些用户无法登录,csrf令牌无效,可能是php会话问题,未产生错误

时间:2018-10-19 17:02:19

标签: php symfony session caching csrf

我最近从Symfony 3.4升级到4.2。服务器更新期间存在一些问题。最初,我将会话存储在服务器上的文件中,但是后来我将其更改为存储在数据库中。我的问题是某些用户无法创建会话。结果是它们无法登录,将项目添加到购物篮等。CSRF令牌也会受到影响,因为这些令牌存储在会话中。我无法重现问题。

我的会话配置看起来像这样

session:
        cookie_domain: "%host%"
        cookie_httponly: true
        #handler_id: session.handler.native_file
        #save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%"
        handler_id: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
        cookie_secure: true
        gc_maxlifetime: 43200 #12 hours
        gc_probability: 1
        gc_divisor: 50
        cookie_lifetime: 0

似乎,如果用户清除其浏览器缓存,则一切恢复正常。但是,我不能要求客户这样做。他们的浏览器中是否有一些过时的会话数据不会消失?如果用户尝试登录,我可以在数据库中看到成功的登录,但是他们说他们没有登录。

这仅影响某些客户。我无法将其范围缩小到任何特定的浏览器或平台,但似乎大多数报告都针对Chrome。如果他们尝试使用其他浏览器,那么它将起作用。

如果我自己尝试一下,它将起作用,并且可以在开发工具中看到cookie PHPSESSID。

我尝试做的一件事,是因为我想可能有两个相互冲突的PHPSESSID cookie(一个在域上带有。,而另一个没有)是将这部分javascript添加到每个页面中

document.cookie =“ PHPSESSID =; Path = /; expires = Thu,1970年1月1日,格林尼治标准时间;”;

我认为这可以确保删除重复项。但是它并没有解决问题。

对于如何调试此问题,我有些困惑。有人可以提供任何建议吗?

1 个答案:

答案 0 :(得分:0)

我通过编写php脚本从用户浏览器中删除两个冲突的会话cookie来解决了该问题。一个在域名前带有一个点,另一个没有。然后,他们可以正确使用单个会话cookie。从php会话文件更改到将会话存储在数据库之间似乎已经出现了问题。在Chrome中,它已将php会话cookie存储在浏览器中,而域上没有前面的点。更改为将会话存储在数据库中之后,已经拥有该会话cookie的用户最终会得到重复的副本,然后出现冲突。同样在Symfony 4中,现在有了迁移会话的正确方法-https://symfony.com/blog/new-in-symfony-4-1-session-improvements

我希望这对某人有帮助。