当前位置: 首页 > 知识库问答 >
问题:

Symfony 2使用不带类的表单时添加CSRF令牌

国高杰
2023-03-14

首先,我对Symfony 2是个十足的傻瓜。这个问题听起来很简单,如果我试着把一些背景放在为什么和如何需要这个问题上,它会开始变得混乱。

本质上,我创建了一个表单,我使用条令等手动处理、验证和插入表单。我在控制器操作中手动创建表单(它是根据从另一个对象检索的值动态构建的)。我想也许有更好的方法可以做到这一点,但由于我对Symfony还不熟悉,而且我已经用了好几天的时间拖网了,所以我找不到任何解决方案来解决我需要做的事情。

因此,我不是简单地针对类/实体等构建表单,所以我需要手动添加CSRF令牌或某种保护。

在正常情况下,您将创建FormType并配置默认选项以具有csrf_保护。然后是一个简单的例子:

{{ form_widget(form._token) }}

csrf令牌就在那里。

在动态构建表单时,我不确定如何为表单手动创建csrf令牌。有没有人有过在没有类的情况下创建表单并添加csrf保护的经验?

你好,保罗·庞德

共有3个答案

宇文迪
2023-03-14

在(我的)正常情况下,您创建了一个表单,并且没有专门配置CSRF-它会自动发生,您可以使用表单_rest(form)表单_end(form)来呈现带有CSRF令牌的隐藏输入。我不认为这与没有模型支持的表单有任何不同。

常子濯
2023-03-14

表单类型和令牌之间的连接:

{{ 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',
    ));
}

// ...
}
吕承福
2023-03-14

我认为您需要的是:

这将呈现一个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保护,但是CSRF令牌唯一一次放置在隐藏字段中的时间是何时使用。我正在通过ajax发布数据,并且也需要发送CSRF以防止出现500个错误。 我以为有一种方法可以将CSRF令牌显式地嵌入到页面中,但是我似乎找不到它。 如果页面上没有表单,如何获得CSRF令牌? 问题答案: 您可以通过安全性类获取CSRF令牌名称和值:

  • 我正在尝试使用yml格式将列添加到现有表中。将新列条目添加到.yml文件中,并运行命令生成实体 通过运行该命令,得到一个错误 这是我的yml文件:

  • 我正在使用Symfony2。0和FOSUserBundle,并希望在我的登录表单上禁用csrf令牌。 我已经禁用了csrf保护全球在我的网站在我的config.yml: 这工作得很好,没有csrf字段添加到我的表单中。但是,这不适用于登录表单。仅在此表单上,如果我没有将令牌包含在表单中,则会出现“无效的CSRF令牌”错误: 如何在登录表单上禁用CSRF令牌?

  • 基于文档:http://symfony.com/doc/2.8/form/dynamic_form_modific.html#form-events-submitted-data 我准备了动态生成表单。所有的工作都正常,但只有当我使用form添加新数据(/new)时,当我使用相同的form编辑现有数据时--不工作 “约会”的简单形式。它应该是这样工作的:用户选择客户机,然后第二个“选择”是填充正确

  • 我想在div上添加一个属性,如下所示: 使用jQuery,所以我尝试了以下方法: