php - 如何在 Symfony 2 中实现跨多个表单的单个 CSRF token ?

标签 php forms security symfony csrf

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

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

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

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

我的问题有三个方面:

  1. 有什么方法可以实现每个 session 的 CSRF token 而不是每个表单的意图?反对的理由是什么?
  2. 这是否可以“开箱即用”地实现,或者是否需要编写忽略表单的 intention 的自定义提供程序?
  3. 将表单类型序列化为 JSON 并为每个表单维护不同的 CSRF token 实例会更好吗?

顺便说一句,OWASP 提供了一个 general recommnedation关于这个主题:

"In general, developers need only generate this token once for the current session. After initial generation of this token, the value is stored in the session and is utilized for each subsequent request until the session expires. When a request is issued by the end-user, the server-side component must verify the existence and validity of the token in the request as compared to the token found in the session..."

最佳答案

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

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

3) 实现您想要的效果的最佳方法是仅呈现每个表单并使用 javascript 序列化表单并将其提交给单独的 Controller 操作。您的代码会更简洁,安全问题也会更少。

关于php - 如何在 Symfony 2 中实现跨多个表单的单个 CSRF token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22119582/

相关文章:

PHP:比较 5.2 和 5.2.0 时,version_compare() 返回 -1?

javascript - 使用 load 方法发送表单后隐藏提交按钮

php PDO类内部如何计算

php - 使用php进行Linux终端用户认证

javascript - 从 TextArea 运行 JavaScript

javascript - 跳过 jQuery 多部分表单中的步骤

google-chrome - 如何在 .Net framework 4.0.30319 中设置 HttpCookie Samesite 属性?

rest - 金融科技/银行应用程序上可能的 API 授权技术

asp.net - CS0016 : Directory invalid error

php - 使用图像上传脚本上传文件