【问题标题】:How can I achieve a single CSRF token across multiple forms in Symfony 2?如何在 Symfony 2 中跨多个表单实现单个 CSRF 令牌?
【发布时间】:2014-03-02 21:04:28
【问题描述】:

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

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

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

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

我的问题有三个:

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

顺便说一句,OWASP 就这个主题提出了general recommnedation

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

【问题讨论】:

    标签: php forms security symfony csrf


    【解决方案1】:

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

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

    3) 实现您想要的最佳方式是仅渲染每个表单并使用 javascript 序列化表单并将其提交到单独的控制器操作。您的代码会更干净,安全问题也会更少。

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 2020-01-06
      • 2013-12-02
      • 1970-01-01
      • 2018-03-01
      • 2014-10-06
      • 2018-05-10
      • 2013-04-14
      • 1970-01-01
      相关资源
      最近更新 更多