Во-первых, я полный 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', )); } // ... }