首先,我是Symfony 2的完整noobie。问题听起来很简单,如果我尝试将一些上下文放入为什么以及如何需要它,它将开始变得混乱。
本质上我已经创建了一个表单,我使用Doctrine等手动处理,验证和插入。我在控制器操作中手动创建表单(它是从另一个对象的检索值动态构建的) )。我假设可能有更好的方法来做到这一点,但由于我是Symfony的新手以及在网上拖网的日子,我无法找到解决我需要做的事情。
因此,我不是简单地针对类/实体等构建表单,因此我将手动需要添加CSRF令牌或某种保护。
在正常情况下,您将创建FormType并配置默认选项以使用csrf_protection。然后是一个简单的例子:
{{ form_widget(form._token) }}
并且csrf令牌就在那里。
由于我动态构建表单,我不知道如何为表单手动创建csrf令牌。有没有人有任何创建没有类的表单并添加csrf保护的经验?
亲切的问候 Paul Pounder
答案 0 :(得分:26)
我认为您正在寻找的是以下内容:
这将呈现CSRF令牌。如果您想要CSRF保护而不创建表单
,请使用此功能
{{ csrf_token("intention") }}
例如:
<a href="{{ path('remove_stuff', {token: csrf_token('intention')}) }}">Remove</a>
要从控制器验证此令牌,您可以执行以下操作:
if ($this->get('token') !== $this->get('security.csrf.token_manager')->getToken('intention')->getValue()) {
throw new \Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException('Invalid CSRF token');
}
简化检查Symfony 2.6或更新版本上的令牌
if ($this->isCsrfTokenValid('intention', $submittedToken)) {
// ... do something, like deleting an object
}
答案 1 :(得分:11)
表单类型和令牌之间的连接:
{{ csrf_token("task_item_intention") }}
并在表单类型中:
class TaskType extends AbstractType
{
// ...
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\TaskBundle\Entity\Task',
'csrf_protection' => true,
'csrf_field_name' => '_token',
// a unique key to help generate the secret token
'intention' => 'task_item_intention',
));
}
// ...
}
答案 2 :(得分:6)
在(我)正常情况下,您创建一个表单并且不专门配置CSRF - 它会自动发生,您使用form_rest(form)
或form_end(form)
呈现隐藏的输入使用CSRF令牌。对于没有模型支持的表单,我不认为这有任何不同。