Использование CSRF-защиты в форме входа в систему

При использовании формы входа в систему, вы должны убедиться, что вы защищены от CSRF-атак (Межсайтовая подделка запроса). Компонент Безопасность уже имеет встроенную поддержку для CSRF. В этой статье вы узнаете, как вы можете использовать её в вашей форме входа в систему.

Note

CSRF-атаки входа немного менее известны. Смотрите Подделка запросов входа, если вас интересуют более подробные детали.

Конфигурация CSRF-защиты

Для начала, сконфигурируйте компонент Безопасности так, чтобы он мог использовать CSRF-защиту. Компонент Безопасность требует поставщика CSRF-токена. Вы можете сделать так, чтобы компонент Безопасноти использовал доступного по умолчанию поставщика:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    # app/config/security.yml
    security:
        # ...
    
        firewalls:
            secured_area:
                # ...
                form_login:
                    # ...
                    csrf_token_generator: security.csrf.token_manager
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- app/config/security.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <srv:container xmlns="http://symfony.com/schema/dic/security"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:srv="http://symfony.com/schema/dic/services"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <config>
            <!-- ... -->
    
            <firewall name="secured_area">
                <!-- ... -->
                <form-login csrf-token-generator="security.csrf.token_manager" />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    // app/config/security.php
    $container->loadFromExtension('security', array(
        // ...
    
        'firewalls' => array(
            'secured_area' => array(
                // ...
                'form_login' => array(
                    // ...
                    'csrf_token_generator' => 'security.csrf.token_manager',
                ),
            ),
        ),
    ));
    

Компонент Безопасность может быть сконфигурирован далее, но это вся информация, которая ему нужна для того, чтобы использовать CSRF в форме выполнения входа.

Tip

Если вы используете Аутентификатор Guard, то вам понадобится валидировать CSRF-токен вручную внутри этого класса. Смотрите Добавление CSRF-защиты, чтобы узнать детали.

Отображение CSRF-поля

Теперь, когда компонент Безопасность будет проверять CSRF-токен, вам нужно добавить скрытое поле к форме входа в систему, содержащее CSRF-токен. По умолчанию, это поле называется _csrf_token. Это скрытое поле должно содержать CSRF-токен, который может быть сгенерирован, используя функцию csrf_token(). Эта функция требует ID токена, который должен быть установлен, как authenticate при использовании формы входа в систему:

  • Twig
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    {# src/AppBundle/Resources/views/Security/login.html.twig #}
    
    {# ... #}
    <form action="{{ path('login') }}" method="post">
        {# ... поля входа в систему #}
    
        <input type="hidden" name="_csrf_token"
            value="{{ csrf_token('authenticate') }}"
        >
    
        <button type="submit">login</button>
    </form>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- src/AppBundle/Resources/views/Security/login.html.php -->
    
    <!-- ... -->
    <form action="<?php echo $view['router']->path('login') ?>" method="post">
        <!-- ... поля входа в систему -->
    
        <input type="hidden" name="_csrf_token"
            value="<?php echo $view['form']->csrfToken('authenticate') ?>"
        >
    
        <button type="submit">login</button>
    </form>
    

После этого, вы защитите вашу форму входа в систему от CSRF-атак.

Tip

Вы можете изменить имя поля, установив csrf_parameter``и изменить ID токена, установив ``csrf_token_id в вашей конфигурации:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    # app/config/security.yml
    security:
        # ...
    
        firewalls:
            secured_area:
                # ...
                form_login:
                    # ...
                    csrf_parameter: _csrf_security_token
                    csrf_token_id: a_private_string
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!-- app/config/security.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <srv:container xmlns="http://symfony.com/schema/dic/security"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:srv="http://symfony.com/schema/dic/services"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <config>
            <!-- ... -->
    
            <firewall name="secured_area">
                <!-- ... -->
                <form-login csrf-parameter="_csrf_security_token"
                    csrf-token-id="a_private_string"
                />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    // app/config/security.php
    $container->loadFromExtension('security', array(
        // ...
    
        'firewalls' => array(
            'secured_area' => array(
                // ...
                'form_login' => array(
                    // ...
                    'csrf_parameter' => '_csrf_security_token',
                    'csrf_token_id'     => 'a_private_string'
                ),
            ),
        ),
    ));
    

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.