【问题标题】:php symfony 1.4: how to redirect with csrf tokenphp symfony 1.4:如何使用 csrf 令牌重定向
【发布时间】:2012-09-11 19:22:06
【问题描述】:

我想在同一模块中从动作 a 重定向到动作 b。 Action b 需要 csrf 令牌才能执行,我还需要传递一些参数。

动作一:

public function executeA(sfWebRequest $request){

   //... do stuff

   $this->redirect('module/b?id='.$something->getId());

}

动作b:

public function executeB(sfWebRequest $request){

   $request->checkCSRFProtection(); //morte

   $something_id = $request->getParameter('id');
   //... do stuff

}

动作 b 仅在单击由 link_to('module/b?id='.$something.getId() , array('method' => 'post')) 或任何其他方法创建的锚点时才会执行,因为它会随请求发送 csrf 令牌。

我尝试了 $this->forward()$this->redirect() 方法,并尝试添加 'method' => 'post' 以重定向参数,如 link_to() ,但没有任何效果,我也无法在网络上找到任何关于它的信息。 API 文档说明了这一点。我得到的只是

 500 | Internal Server Error | sfValidatorErrorSchema
_csrf_token [Required.]

错误。它在标记为//morte 的行上失败。请问有谁知道如何正确执行此操作,以及在我想重定向到其他模块的情况下?

【问题讨论】:

  • _csrf_token 仅用于表单。您要转发表格吗?
  • _csrf_token 也用于带有某些方法的锚点。 url_for('module/action' , array('method' => 'post') 例如就是这样做的。检查这样一个锚的html。我在操作中使用$request->checkCSRFProtection(),我不想仅仅通过输入网址就可以访问。回答您的问题:不,我不转发表格。我只希望在处理完表单后触发受 csrf 保护的操作。
  • 这对我来说还不清楚..
  • 我会更详细地重写问题
  • 现已编辑。谢谢你的回答

标签: php redirect symfony-1.4


【解决方案1】:

好的,现在更清楚了。

事实上,_csrf_token 没有重定向到其他操作,我的意思是,您没有在查询中重新添加它。

试试:

public function executeA(sfWebRequest $request){

   //... do stuff

   $this->redirect('module/b?id='.$something->getId().'?_csrf_token='.$request->getParameter('_csrf_token'));

}

【讨论】:

  • 是否可以在控制器内部生成令牌,例如executeB 类?
  • 嗯,是的。你应该创建一个假的 sfForm 然后调用getCSRFToken()。但是你为什么不生成一个自定义参数,比如execute1 中的 ?nocsrf=1 然后检查executeB 如果nosrf 在这里,不要调用checkCSRFProtection
  • 不会达到目的吗?任何知道该参数工作的人都可以绕过 CSRF 保护检查。我用假表格试过了,但它不起作用。 [CSRF attack detected.] 我不知道 $this->checkCSRFProtection() 方法在 symfony 中是如何工作的,但是根据错误报告,它在某些 sfForm 上执行了 bind() 函数,尽管我没有在控制器部分创建任何表单来检查它。
  • 您是否尝试过我的回答中的解决方案?令牌是在第一次请求时根据密码、会话 ID 和调用生成的类生成的。然后,在提交请求时,它会检查代码是否匹配同一代。 executeAexecuteB 在同一个控制器中吗?
  • 我做了,但$request->getParameter('_csrf_token') 什么也没返回,并且使用处理后的表单中的令牌返回了 CSRF 攻击错误。
猜你喜欢
  • 2020-08-15
  • 2023-02-20
  • 2014-10-06
  • 2020-05-19
  • 2018-05-10
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多