2012-02-09 143 views
7

我继承了一个symfony2项目,它在活动环境中运行超过2个负载平衡服务器。会话存储在应用程序因此出现的mysql数据库中。CSRF令牌在负载均衡symfony2应用程序中无效

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

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

任何人都可以指向正确的方向或有类似的问题吗?

+0

会话是否按预期工作? – 2012-02-09 14:21:04

+0

是的,用户的会话管理工作正常。如果表单被发回到服务器,并且它不是来源的,那么这只是csrf标记警告。我已经通过在使用IP地址的负载平衡服务器之一上工作来测试了这一点。 – chrishey 2012-02-09 15:16:54

+0

我正在努力的是理解SessionCsrfProvider是否使用存储在数据库中的会话。有关调试的任何提示?由于我们拥有的唯一负载平衡环境是活的,因此测试很困难。谢谢 – chrishey 2012-02-10 10:28:46

回答

2

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

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

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

这可能意味着您的session_id()是不一样的取决于什么机器处理请求。

+3

看来修复是两个服务器的parameters.ini密钥是不一样的,即使我纠正了这个问题,直到我清除了应用缓存并在两台服务器上重新启动apache几次后才生效。感谢你的帮助。 – chrishey 2012-02-13 09:42:14