【问题标题】:CSRF token invalid in load balanced symfony2 applicationCSRF 令牌在负载平衡的 symfony2 应用程序中无效
【发布时间】:2012-03-01 22:05:54
【问题描述】:

我继承了一个 symfony2 项目,该项目在实时环境中运行在超过 2 个负载平衡服务器中。由于这个原因,会话存储在应用程序使用的 mysql 数据库中。

我遇到的问题是,在具有 CSRF 保护的表单上,有时令牌返回无效。我猜这是因为生成令牌的服务器并不总是获取表单 POST 并且无法匹配正在发送的令牌的服务器。

我对 symfony 非常非常陌生,并且尝试了几种不同的解决方案来使用 Symfony 框架中的会话和 SessionCsrfProvider 生成令牌。

谁能指出我正确的方向或遇到过类似的问题?

【问题讨论】:

  • 会话是否按预期工作?
  • 是的,用户的会话管理工作正常。如果将表单回发到并非源自它的服务器,则只会触发 csrf 令牌警告。我已经通过使用 IP 地址在其中一台负载平衡服务器上进行了测试。
  • 我正在努力理解 SessionCsrfProvider 是否正在使用存储在数据库中的会话。有什么调试技巧吗?由于我们拥有的唯一负载平衡环境是实时的,因此测试起来很棘手。谢谢
  • 您是否验证过parameter.ini 中的密钥在两台服务器上是否相同?我唯一遇到的麻烦是当我更改已部署应用程序中的密钥时。我想你可以创建自己的 SessionCsrfProvider 并进行一些日志记录(服务器主机、用户 IP 地址、会话 ID)来尝试跟踪。
  • 感谢您的建议,由于某种原因,密钥不一样,我更正了此问题并重新启动了 apache,但问题仍然存在。

标签: mysql session symfony load-balancing


【解决方案1】:

CsrfProviders 将通过连接密钥(来自 parameters.ini)+ 意图(默认为 null)+ 会话 id 来生成令牌。

默认情况下,symfony 配置为使用SessionCsrfProvider,它使用会话storage id。

如果您使用的是 PDOSessionStorage 或 NativeSessionStorage 对象,它将返回 session_id()

这可能意味着您的session_id() 与处理请求的机器不同。

【讨论】:

  • 似乎解决方法是两个服务器上的 parameters.ini 密钥不一样,即使我纠正了这个问题,它也没有生效,直到我清除了应用程序缓存并重新启动了 apache在两台服务器上几次。感谢您的所有帮助。
猜你喜欢
  • 2015-10-25
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
相关资源
最近更新 更多