Symfony 2 Добавить токен CSRF при использовании формы без класса

Во-первых, я полный noobie с Symfony 2. Вопрос звучит просто, если я попытаюсь внести некоторый контекст в то, почему и как мне это нужно, он начнет запутываться.

По сути, я создал форму, которую я вручную обрабатываю, проверяю и вставляю с помощью Doctrine и т. Д. Я вручную создаю форму внутри действия контроллера (она динамически создается из полученных значений из другого объекта). Я предполагаю, что могут быть лучшие способы сделать это, но поскольку я новичок в 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', )); } // ... }