由于直接访问登录表单时未设置 session cookie,CSRF 令牌无效
Invalid CSRF token as a result of session cookie not being set when visiting login form directly
在进一步调查后更新此 post 以确保它专注于实际问题(现在也在 https://github.com/symfony/symfony/issues/42691 提出)
我的环境
我是运行:
- Symfony 5.3.6
- PHP 版本 7.3
- WSL2
上的 Debian 10 运行
- 本地主机上的 Symfony 开发服务器,通过同一台机器上的 Chrome 访问
描述和我想要实现的目标
- 我正在尝试按照 Symfony 教程 (https://symfony.com/doc/current/security/form_login_setup.html) 实施安全登录表单。
- 我收到错误消息“无效的 CSRF 令牌”。第一次登录尝试,但不是后续登录尝试。
- 调试(使用 Xdebug 3)后,Symfony 似乎没有创建 session 到 link 的 CSRF 令牌。
重现步骤
- 使用
symfony new test_project
创建了一个新的 Symfony 项目
- 使用
composer require symfony/maker-bundle --dev
安装了 maker 包
- 已遵循安全性 set-up 指南(https://symfony.com/doc/current/security.html)第 1-2 节
- 按照本指南使用
make:auth
命令生成了登录表单 https://symfony.com/doc/current/security/form_login_setup.html
- 已访问 https://localhost:8000/login
- 使用有效的用户名和密码对以及隐藏的 pre-generated CSRF 令牌提交登录表单
我期待的结果
- 注册用户能够登录 https://localhost:8000/login
实际结果
- 访问https://localhost:8000/login时,没有设置cookie
- 当提交包含CSRF token的登录表单时,由于这个请求没有cookie,Symfony找不到session,所以自然找不到CSRF token
- 由于没有 CSRF 令牌,Symfony 抛出异常“无效的 CSRF 令牌”。此响应 headers 包含一个代表 session 的 cookie(假设是自动的,因为我遵循了 Symfony 教程)
- 第二次提交登录表单时,由于在请求 headers 中发送了一个 cookie,Symfony 在 session 上“找到”了 CSRF 令牌,因此登录的工作方式如下预计
在 Symfony 的 github 上发帖后,他们的回复帮助我发现了问题。 Here is my post for interest.
看来问题是我使用的 PHP 7.3 已达到使用寿命。我设法使 security.yaml 和 framework.yaml 中的所有原始配置设置保持不变,并使我自己的 Symfony 项目现在可以运行。但是,Symfony 中没有任何内容提醒我 PHP 7.3 不兼容。
我做了什么
- 升级到 PHP 8.0.10 this guide
结果
- 我不再收到 CSRF 错误,我的登录功能在我自己的 Symfony 项目中都按预期工作。
在进一步调查后更新此 post 以确保它专注于实际问题(现在也在 https://github.com/symfony/symfony/issues/42691 提出)
我的环境
我是运行:
- Symfony 5.3.6
- PHP 版本 7.3
- WSL2 上的 Debian 10 运行
- 本地主机上的 Symfony 开发服务器,通过同一台机器上的 Chrome 访问
描述和我想要实现的目标
- 我正在尝试按照 Symfony 教程 (https://symfony.com/doc/current/security/form_login_setup.html) 实施安全登录表单。
- 我收到错误消息“无效的 CSRF 令牌”。第一次登录尝试,但不是后续登录尝试。
- 调试(使用 Xdebug 3)后,Symfony 似乎没有创建 session 到 link 的 CSRF 令牌。
重现步骤
- 使用
symfony new test_project
创建了一个新的 Symfony 项目
- 使用
composer require symfony/maker-bundle --dev
安装了 maker 包
- 已遵循安全性 set-up 指南(https://symfony.com/doc/current/security.html)第 1-2 节
- 按照本指南使用
make:auth
命令生成了登录表单 https://symfony.com/doc/current/security/form_login_setup.html - 已访问 https://localhost:8000/login
- 使用有效的用户名和密码对以及隐藏的 pre-generated CSRF 令牌提交登录表单
我期待的结果
- 注册用户能够登录 https://localhost:8000/login
实际结果
- 访问https://localhost:8000/login时,没有设置cookie
- 当提交包含CSRF token的登录表单时,由于这个请求没有cookie,Symfony找不到session,所以自然找不到CSRF token
- 由于没有 CSRF 令牌,Symfony 抛出异常“无效的 CSRF 令牌”。此响应 headers 包含一个代表 session 的 cookie(假设是自动的,因为我遵循了 Symfony 教程)
- 第二次提交登录表单时,由于在请求 headers 中发送了一个 cookie,Symfony 在 session 上“找到”了 CSRF 令牌,因此登录的工作方式如下预计
在 Symfony 的 github 上发帖后,他们的回复帮助我发现了问题。 Here is my post for interest.
看来问题是我使用的 PHP 7.3 已达到使用寿命。我设法使 security.yaml 和 framework.yaml 中的所有原始配置设置保持不变,并使我自己的 Symfony 项目现在可以运行。但是,Symfony 中没有任何内容提醒我 PHP 7.3 不兼容。
我做了什么
- 升级到 PHP 8.0.10 this guide
结果
- 我不再收到 CSRF 错误,我的登录功能在我自己的 Symfony 项目中都按预期工作。