在Symfony 2中存在某种方式在每次呈现表单时生成CSRF令牌? 在我的控制器我想是这样的:生成CSRF令牌依赖日期时间
$request = $this->get('request');
if ($request->getMethod() != 'POST') {
$csrf = $this->get('form.csrf_provider');
$date= new \DateTime("now");
$this->date = $date->format('Y-m-d H:i:s');
$token = $csrf->generateCsrfToken($this->date);
} elseif($request->getMethod() == "POST") {
$csrf = $this->get('form.csrf_provider');
$token = $csrf->generateCsrfToken($this->date);
}
$form = $this->createFormBuilder()
....
->add('_token','hidden',array(
'data' => $token
))->getForm();
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
DO something
}
}
所有的时间都在我的请求权标记哈希值。但是bindRequest将其更改为parameters.ini中安全字符串生成的默认哈希值,并且isValid方法肯定会返回FALSE响应。存在某种方式,如何调整它?
编辑 针对theunraveler答案,我编辑我的控制器,并创建我的CSRF供应商,但仍即时通讯歌厅“的CSRF令牌无效,请尝试重新提交表单”的错误。我CSRF提供商看起来是这样的:
namespace My\Namespace;
use Symfony\Component\HttpFoundation\Session;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
class MyCsrfProvider implements CsrfProviderInterface
{
protected $session;
protected $secret;
protected $datetime;
public function __construct(Session $session, $secret)
{
$this->secret = $secret;
$this->datetime = new \DateTime('now');
$this->session = $session;
}
public function generateCsrfToken($intention)
{
return sha1($this->secret.$intention.$this->datetime->format('YmdHis').$this->getSessionId());
}
public function isCsrfTokenValid($intention, $token)
{
return $token === $this->generateCsrfToken($intention);
}
protected function getSessionId()
{
return $this->session->getId();
}
}
比我添加到config.yml服务类:
services:
form.csrf_provider:
class: My\Namespace\MyCsrfProvider
arguments: [ @session, %kernel.secret% ]
和控制器I改成这样:
//any form without _token field
$form = $this->createFormBuilder()
->add('field1')
->add('field2')->getForm()
if ($this->getRequest()->getMethod() == 'POST') {
$request = $this->getRequest();
$form->bindRequest($request);
if ($form->isValid()) {
Do something
return $this->redirect($this->generateUrl('somewhere'));
}
}
不能在几秒钟的问题在我的散列?如果我从日期时间格式中删除秒数,它会起作用,但1分钟到期并不是一个好的解决方案。我想,原因是时间发生了变化。
真的没人提供一些提示吗? – gavec 2013-04-09 21:00:53
你能解决这个问题吗? – JohnnyQ 2015-01-28 12:39:51