2012-02-29 35 views
3

我使用sfDoctrineGuard和sfForkedDoctrineApply。我编写了一个模块,允许登录用户创建一个继承父级配置文件设置的子用户。它的工作方式很好,它的写法,但是我必须关闭整个应用程序的csrf保护(在设置中),以便使其工作,因为它打开时,它(正常地,我可能会添加)检测到csrf攻击。所以,我需要一种方法来关闭它,或者至少捕获并删除验证。symfony 1.4如何关闭一个注册表单的csrf保护?

我已经尝试了很多技术,但都没有工作。其中包括:

 $this->disableLocalCSRFProtection(); 

的形式。问题是,这是一个自定义表单,并且正在调用父配置,它正在注入csrf保护。

我读过一些我认为指向正确方向的解决方案:Symfony 1.4: Custom error message for CSRF in forms但他们没有解决这个特定的问题。

欢迎提出建议和解决方案。提前致谢。

+0

你在哪儿做'$ this-> disableLocalCSRFProtection();'调用?在'YourForm :: configure()'中? – 2012-02-29 21:26:33

+0

是的,我在表单配置中打了电话。 – Patrick 2012-02-29 21:46:22

+0

“_it是一个自定义窗体,并且正在调用父配置,它正在注入csrf protection_”您是否有可能使用'disableLocalCSRFProtection()'在父窗体中禁用csrf保护? – melekes 2012-03-01 15:36:23

回答

6

基础sfForm构造函数配置是否启用以及CSRFSecret是什么。

class sfForm implements ArrayAccess, Iterator, Countable 
{ 
    public function __construct($defaults = array(), $options = array(), $CSRFSecret = null) 
    { 
    $this->setDefaults($defaults); 
    $this->options = $options; 
    $this->localCSRFSecret = $CSRFSecret; 

    $this->validatorSchema = new sfValidatorSchema(); 
    $this->widgetSchema = new sfWidgetFormSchema(); 
    $this->errorSchema  = new sfValidatorErrorSchema($this->validatorSchema); 

    $this->setup(); 
    $this->configure(); 

    $this->addCSRFProtection($this->localCSRFSecret); 
    $this->resetFormFields(); 
    } 
} 

在这种情况下,如果通过disableLocalCSRFProtection()禁用本地CSRF保护不起作用,您可以尝试用“假” CSRFSecret”创建表单实例

例:

$myForm = new myForm(array(), array(), false); 

编辑:(以上建议没有为海报工作)

您可以试试,只是在应用程序的settings.yml中注释“csrf_secret”配置。在评论此行后,不要忘记清除symfony的缓存。要验证全局禁用CSRF保护,您可以按如下方式检查“sf_csrf_secret”配置的值;

var_dump(sfConfig::get('sf_csrf_secret')) 

这应该给你一个布尔值false,这意味着在契约中所有的CSRF保护被禁用。

+0

是的,我应该提到我也尝试过这个解决方案......也无济于事。任何其他想法?我认为,我可以在这里避开基地,问题是提交了两个csrf标记(一个用于登录的用户,另一个是为新用户创建的)......这就是为什么它是在启用csrf时正确检测到csrf攻击。 – Patrick 2012-02-29 21:45:34

+0

帕特里克,我希望我的最新编辑适合你。我在这个问题中加入了“这个”评论,以便有时间表。编辑完成时。 – Lashae 2012-02-29 22:01:40

+0

对不起,延迟了...生活中的阻碍。我按照你的建议做了,而且我确实在成功页面的回声上得到了一个布尔(错误)。那么,我的问题就是为什么当我打开csrf保护时,仍然会收到“csrf_token required”消息?它让我感到困惑。 – Patrick 2012-03-01 15:49:45

6

$ this-> disableLocalCSRFProtection();也没有为我工作。 创建表单后,我成功地将crsf验证器必需选项设置为false。

<?php 
    $form = new UploadImageForm(); 
    $form->getValidator($form->getCSRFFieldName())->setOption('required', false); 

    if ($request->isMethod(sfWebRequest::POST)) { 
     ... 
?> 
+0

像冠军一样工作。需要这样做的余地实现,其中不需要CSRF,而是使用api密钥身份验证。 – 2016-05-18 20:45:47