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

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

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

поэтому я не просто создаю форму против класса / сущности и т. д., Поэтому мне вручную нужно будет добавить токен CSRF или какую-то защиту.

в обычных обстоятельствах вы бы создали FormType и настроили параметры по умолчанию для csrf_protection. Затем простой случай:

{{ form_widget(form._token) }}

и токен csrf есть.

поскольку я динамически строю форму, я не уверен, как я могу вручную создать токен csrf для моей формы. Кто-нибудь имел опыт создания форм без класса и добавления защиты csrf?

С уважением Пол Паундер!--2-->

3 ответов


в (моих) нормальных обстоятельствах вы создаете форму и не специально настроить CSRF-это происходит автоматически, и вы используете form_rest(form) или form_end(form) отображать скрытые input с 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',
    ));
}

// ...
}