Как реализовать CSRF-защиту¶
CSRF - или Межсайтовая подделка запроса - это метод, которым злоумешленный пользователь будет пытаться заставить ваших действительных пользователей отправлять данные, которые они не хотят, без их ведома. К счастью, CSRF-атаки можно предотвратить, используя CSRF-метку внутри ваших форм.
Хорошая новость заключается в том, что по умолчанию, Symfony встраивает и валидирует для вас CSRF-метки автоматически. Это означает, что вы можете воспользоваться преимуществами CSRF-защиты, ничего не делая. На самом деле, каждая форма в этой статье использовала CSRF-защиту!
CSRF-защита работает путём добавления скрытого поляв вашу форму - называемого
_token
по умолчанию - которое содержит значение, которое знаете только вы
и ваш пользователь. Это гарантирует то, что пользователь - а не какая-то другая
сущность - отправляет эти данные. Symfony автоматически валидирует присутствие и
точность этой метки.
Поле _token
- это скрытое поле и оно будет автоматически отображено, если
вы включите в ваш шаблон функцию form_end()
, которая гарантирует, что будут
выведены все не отображённые поля.
Caution
Так как метка хранится в сессии, то сессия запускается автоматически как только вы отображаете форму с CSRF-защитой.
CSRF-метка может быть настроена по-разному в разных формах. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // ...
use AppBundle\Entity\Task;
use Symfony\Component\OptionsResolver\OptionsResolver;
class TaskType extends AbstractType
{
// ...
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Task::class,
'csrf_protection' => true,
'csrf_field_name' => '_token',
// уникальный ключ для генерации тайной метки
'csrf_token_id' => 'task_item',
));
}
// ...
}
|
Чтобы отключить CSRF-защиту, установите опцию csrf_protection
как false.
Настройки также можно сделать глобально по всему вашему проекту. Чтобы узнать
больше информации, смотрите раздел справочник конфигурации форм.
Note
Опция csrf_token_id
необязательна, но обычно улучшает безопасность
сгенерированной метки, изменяя её для каждой формы.
Caution
CSRF-метки должны быть разными для каждого пользователя. Поэтому вам нужно быть осторожными, если вы пытаетесь кешировать страницы с формами, включающими в себя такой вид защиты. Чтобы узнать больше, смотрите Caching Pages that Contain CSRF Protected Forms.
Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.