0

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

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

有什么想法吗?

4

2 回答 2

3

登录表单不需要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 :-)

希望它有所帮助。

于 2012-12-04T16:10:36.180 回答
0

实际上,form_rest(form)除了放入 CSRF 令牌之外,此函数还可以打印出任何尚未呈现的表单行,并且可以很好地放入以确保任何被忽略的附加字段肯定会被呈现。

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

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

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

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

于 2012-12-03T22:18:25.157 回答