如何将 CSRF 令牌添加到登录表单?

Posted

技术标签:

【中文标题】如何将 CSRF 令牌添加到登录表单?【英文标题】:How to add CSRF token to login form? 【发布时间】:2012-11-19 23:38:57 【问题描述】:

我不确定这是否有必要,但我在登录表单中看不到任何 csrf 令牌。通常在创建表单时,在末尾添加 form_rest(form),这会添加 csrf 令牌。但是登录表单的处理方式不同,它不是真正的表单对象,它是一种自动魔法。你可以在docs看到。

那是怎么回事?为什么登录表单没有csrf保护?我知道 CSRF 攻击是针对经过身份验证的用户的,但是 Sf2 中的匿名用户在技术上是经过身份验证的(请参阅会话 cookie),而且我可能希望进行某种渐进式参与,例如在 *** 中,您可以在其中执行一些操作而无需成为确认会员。

有什么想法吗?

【问题讨论】:

【参考方案1】:

实际上,form_rest(form) 所做的远不止是在 CSRF 令牌中抛出,这个函数打印出任何尚未呈现的表单行,并且可以很好地确保任何被忽略的附加字段都被忽略肯定会被渲染。

您没有看到 CSRF 令牌的原因是因为 FOSUserBundle 登录表单不是 Symfony 表单,它只是一个常规的 html 表单,然后由 FOSUser 表单处理程序处理。

我不完全确定为什么会做出这个决定,但我确信它背后有技术原因,如果这是一个问题,您可以手动添加一个并扩展表单处理程序以处理和验证它响应,我相信服务是参数化的,所以它应该相对容易换掉。

不过,我最大的问题是,您为什么要费心这样做?这是一笔大买卖吗? CSRF 是一个有用的步骤,但不是万能的安全解决方案,而且就我个人而言,我会有比这更大的优先级,如果这是一个大问题,它会在某个时候在 FOS 中得到修复。

关于您的后一点,我不确定是否相关,这如何阻止您逐步参与?不管怎样,一个快速提示,虽然我自己没有构建系统的这一部分,但在我最近一直在从事的一个电子商务项目中,领导决定实现逐步参与(这样人们可以匿名结账),但仍然坚持很多在他们的操作中,新用户很早就被自动生成的用户名和自定义角色(如 ROLE_GUEST)持久化,而 Symfony 中的默认功能证明不足以满足我们的用例。

【讨论】:

我没有使用 FOSUserBundle。检查我发布的文档,他们不使用表单对象。关于逐步参与,我只是认为 CSRF 可能会造成实际损害,但我认为我很困惑。无论如何,我需要的是知道 Sf2 在登录表单中是否有 CSRF 保护(我没有看到它),以及在登录表单中没有 CSRF 保护是否不好,有多糟糕,以及我该如何解决。 【参考方案2】:

CSRF 保护不需要登录表单。

CSRF 定义:攻击者可以强制受害者向服务器发送 HTTP 请求。

典型的教科书示例:发起汇款。 攻击者可以强制发出这样的请求:http://bank.example.com/withdraw?account=Alice&amount=1000000&for=Eve

如您所见,攻击者必须事先烘焙一个 URL。

在登录请求的情况下,这是没有意义的,因为攻击者必须像这样烘焙一个 URL:http://example.com/login?user=pierre.ernst&pwd=secret。

如果攻击者已经拥有此信息(凭据),他很可能不会尝试 CSRF :-)

希望对你有帮助。

【讨论】:

其实还有一个风险。见***.com/questions/6412813/…

以上是关于如何将 CSRF 令牌添加到登录表单?的主要内容,如果未能解决你的问题,请参考以下文章

将 CSRF 令牌添加到 RestTemplate 获取由表单登录保护的页面的请求

如何在 VueJS 文件中添加 Laravel CSRF 令牌? [复制]

在登录表单上禁用 CSRF 令牌

当我将 dropzone 添加到 Django 中的现有表单时,CSRF 令牌问题

SPA 使用的经过身份验证的 Rest API:如何获取用于登录和注册表单的 CSRF 令牌?

Symfony 2 在使用没有类的表单时添加 CSRF 令牌