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',
));
}
// ...
}