Symfony 4 部分用户无法登录,CSRF 令牌无效,可能存在 PHP 会话问题,未产生错误



我最近从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: SymfonyComponentHttpFoundationSessionStorageHandlerPdoSessionHandler
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=;路径=/;expires=星期四, 01 一月 1970 00:00:01 GMT;";

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

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

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

我希望这对某人有所帮助。

最新更新