首先我用的Symfony 2.问题听起来很简单,如果我尝试把一些背景到原因以及如何我需要这个会开始变得混乱完全noobie。
从本质上说我已经创建了一个表格,其中我手动过程,验证和使用学说等我手动创建一个控制器动作内的形式插入(它动态地建立从检索到的值从另一个对象)。 我假设有可能更好的方法来做到这一点,但我是新来的Symfony和拖网网的日子里,我看不到什么,我需要做的任何解决方案。
所以我不是简单地构建形式对一类/实体等,所以我将需要手动添加CSRF令牌或某种保护。
在正常情况下,你会创建FormType并配置默认选项有csrf_protection。 然后,一个简单的情况:
{{ form_widget(form._token) }}
和CSRF令牌是存在的。
正如我在构建动态的形式,我不知道我怎么可以手动创建一个CSRF令牌我的形式。 有没有人有没有一类创建表单并添加CSRF保护的经验吗?
亲切的问候保罗·庞德尔
在(我的)正常情况下,你创建一个表单,并没有专门配置CSRF -它会自动进行,您使用form_rest(form)
或form_end(form)
来渲染CSRF令牌的隐藏输入。 我不相信这是不是一种模式支持的形式有什么不同。
我想你要找的是以下内容:
这将呈现一个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
}
表单类型和令牌之间的连接:
{{ 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',
));
}
// ...
}