Можно ли обработать простую старую HTML-форму с помощью Symfony, но с помощью токена CSRF? - PullRequest
0 голосов
/ 30 марта 2019

Я делаю форму оплаты в стиле Bootstrap 4 для своего приложения, в которой переключатели выбирают способ оплаты. Пытаясь создать мою форму с помощью классов форм Symfony, я обнаружил, что они слишком ограничены / неуклюжи, чтобы делать то, что я хочу. Я не хочу возиться с тематикой форм Symfony (я нахожу это досадно многословным), я не хочу использовать предварительно созданную Symfony тему Bootstrap, и я НЕ хочу использовать что-либо createFormBuilder.

Итак, есть ли у меня способ сделать простую старую HTML-форму, но с помощью токена Symfony CSRF? Этот ответ выглядит многообещающим, но не упоминает защиту CSRF.

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Согласно этой документации Как реализовать защиту от CSRF , попытка решения - использовать что-то вроде (в 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>
0 голосов
/ 30 марта 2019

Не использовать 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...