Как реализовать 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.