如何在Symfony 2中的多个表单中实现单个CSRF令牌?

时间:2014-03-01 19:58:34

标签: php forms security symfony csrf

......我应该尝试这个吗?

我正在使用Symfony 2(刚刚从2.3升级到2.5),根据我的经验,该框架倾向于为每个表单生成CSRF令牌。如果每页有一个表单,这很好,但通常你想在页面上有多个表单,隐藏,一个表单在某种用户交互后呈现自己。

在Java中,使用Spring Framework,CSRF标记似乎与会话相关联(并作为请求的属性提供)。

我的两个用例是:(1)使用JavaScript驱动的模板(例如Handlebars)在同一页面上支持多种形式(相同类型)和(2)具有多个用例同一页面上的表单(不同类型)也由JavaScript模板驱动。

我的问题有三个:

  1. 有没有办法在每个会话中实现CSRF - 令牌而不是每个表单意图?有什么理由支持这个?
  2. 这可以“开箱即用”,还是需要编写一个忽略表单intention的自定义提供程序?
  3. 将表单类型序列化为JSON并为每个表单维护CSRF令牌的不同实例会更好吗?

  4. 顺便说一下,OWASP在这个问题上提出general recommnedation

      

    通常,开发人员只需为当前会话生成一次此令牌。在初始生成此令牌后,该值将存储在会话中,并用于每个后续请求,直到会话到期为止。请求由最终用户发出,服务器端组件必须验证请求中令牌的存在和有效性,与会话中找到的令牌相比...

1 个答案:

答案 0 :(得分:2)

1)每个会话的每个表单生成csrf标记,因此如果您希望每个会话都有一个csrf标记,您只需要确保所有表单的意图(默认情况下是表单的名称)是相同的。问题是你基本上打开了人们提交一个表格代替另一个表格的大门,就像表格被验证时一样,它会检查csrf并验证为真,即使那个不是它正在寻找的那个。

2)您确实需要确保在创建和验证表单时自己设置意图

3)实现所需内容的最佳方法是只渲染每个表单并使用javascript序列化并将表单提交给单独的控制器操作。你的代码会更清晰,你的安全问题会更少。