是否可以使用Symfony但使用CSRF令牌处理普通的旧HTML表单?

时间:2019-03-30 01:18:32

标签: php forms symfony

我正在为我的应用程序制作Bootstrap 4样式的付款表格,其中单选按钮选择付款方式。在尝试通过Symfony的表单类制作表单时,我发现它们过于严格/笨拙,无法执行我想要的操作。我不想弄乱Symfony的表单主题(我觉得它很冗长),我不想使用Symfony的预制Bootstrap主题,也不想使用任何createFormBuilder

因此,我可以使用Symfony的CSRF令牌制作普通的旧HTML表单吗? answer似乎很有希望,但没有提及CSRF保护。

2 个答案:

答案 0 :(得分:1)

根据本文档How to Implement CSRF Protection, 解决方案的尝试是使用类似的东西(在symfony 3.4和4中):

  • 在控制器中,您可以输入类似以下内容:
   /**
     * @Route("/names", methods={"POST"}, name="app_post_names")
     */
    public function postName(Request $request)
    {
        $name = $request->request->get('name');
        $csrfToken = $request->request->get('_csrf_token');

         if(!$this->isCsrfTokenValid('token_id', $csrfToken)) {
          // ... throw bad request
         } 

         // ... Do other thing
    }

  • 现在,在模板中,您可以拥有类似的东西(具有自己的设计):
<form action="{{ path('app_post_names') }}" method="post">
    Name : <input name="name" type="text" />
    <input name="_csrf_token" value="{{ csrf_token('token_id') }}" type="hidden" />
    <input type="submit" value="send" />
</form>

答案 1 :(得分:0)

根本不使用Symfony,而是生成自己的令牌吗?

制作表格时,您确实不需要使用Symfony表格主题。
我自己总是建立自己的表单标签。
您要自定义选择吗?也可以做
您想使用不在实体中的字段,也可以这样做...

Symfony形式的约束并不像您想象的那样严格。
您很可能对此事没有“知道如何”的认识。

控制器

public function customFormAction(Request $request) {
    $form=$this->createFormBuilder()
               ->setAction($this->generateUrl('route_name'))
               ->setMethod('POST')
               ->add("customField", ChoiceType::class, array(
                   'choices'=>array(
                       '1'=>'Choice 1',
                       '2'=>'Choice 2',
                       '3'=>'Choice 2',
                   ),
                   'required'=>true,
                   'mapped'=>false, //Isn't mapped to any entity
               ))
               ->getForm();

    $form->handleRequest($request);
    if($form->isSubmitted() && $form->isValid()) {
        $customField=$form->get('customField')->getData();
        //do your stuff
    }

    return $this->render('route_name', array(
        'form'=>$form->createView(),
    ));
}

树枝视图

<form action="{{ form.vars.action }}" method="{{ form.vars.method }}">
    <div class="input-field">
        <select id="{{ form.customField.vars.id }}" name="{{ form.customField.vars.full_name }}" class="my_classes">
            {% for option in form.customField.vars.choices %}
                <option data-attr="my_attributes" value="{{ option.value }}">{{ option.label }}</option>
            {% endfor %}
        </select>
    </div>
    <input name="{{ form._token.vars.full_name }}" value="{{ form._token.vars.value }}" type="hidden">
</form>

有了这个,我几乎没有使用任何树枝模板,我仍然拥有CSRF令牌,而Symfony几乎不处理表格(它只会检查CSRF令牌)