Symfony2 注销 CSRF 保护:csrf_provider 无法识别

Posted

技术标签:

【中文标题】Symfony2 注销 CSRF 保护:csrf_provider 无法识别【英文标题】:Symfony2 logout CSRF protection: csrf_provider unrecognized 【发布时间】:2014-08-12 18:15:09 【问题描述】:

如何保护注销操作?我读了default configuration,然后设置

logout:
    csrf_parameter:       _token
    csrf_provider:        ~
    intention:            logout

但是当我尝试清除缓存时显示以下错误:

[Symfony\Component\Config\Definition\Exception\InvalidConfigurationException] “security.firewalls.main.logout”下无法识别的选项“csrf_provider”

我正在使用 Symfony 2.4 + FOSUserBundle 1.3。

【问题讨论】:

你能改写你的问题标题吗?通常它应该不包含任何在问题中标记的关键词。您的标题仅包含关键字。 你检查过这个吗:***.com/questions/20350330/…? @isi 抱歉,但我无法改写它,因为它非常具体,而且我的想象力和英语水平低下会阻止这样做:( 如果版主认为有必要改写它 - 我同意。 @DenisV 我已经检查过这个话题。这与我的问题不太相关,但我的应用中已经启用了 CSRF 保护。 【参考方案1】:

我研究了 Symfony 的代码,发现现在 csrf_provider 选项重命名为 csrf_token_generator。然后我用谷歌搜索并找到了相关的issue on GitHub。所以问题在一个不同步的文档中。

最终的解决方案是:

配置:

# app/config/security.yml

security:
    # ...
    firewalls:
        # ...
        your_firewall_name:
            # ...
            logout:
                # ...
                csrf_token_generator: your_csrf_provider # e.g. form.csrf_provider

树枝模板:

<a href=" logout_url('your_firewall_name') ">Logout</a>

请注意,由于帮助程序错误,我们使用logout_url() 而不是logout_path()(它在开发环境中生成没有app_dev.php 后缀的绝对路径)。 Theese twig helpers 将 %token_parameter% 附加到您的注销 URI,例如http://example.com/app_dev.php/logout?_csrf_token=36wX6HYU2ASeZBQw_iwKcUDbplmFm4W7Ez-tMaavDNo.

希望这些信息会有所帮助。

【讨论】:

以上是关于Symfony2 注销 CSRF 保护:csrf_provider 无法识别的主要内容,如果未能解决你的问题,请参考以下文章

在 ajax 提交时禁用 symfony 2 csrf 令牌保护

将 csrf 令牌和参数名称添加到注销链接

spring security CSRF 保护

Symfony CSRF 和 Ajax

_csrf 令牌在同一个 JSP 中的 2 种形式(CSRF 保护)

在登录表单上禁用 CSRF 令牌