Uso di CSRF nel form di login

Quando si usa un form di login, ci dovrebbe assicurare di essere protetti contro CSRF (Cross-site request forgery). Il componente Security include già un supporto per CSRF. In questa ricetta vedremo come lo si può usare nei form di login.

Nota

Gli attacchi CSRF ai login sono meno noti. Vedere Forging Login Requests per maggiori dettagli.

Configurazione della protezione CSRF

Innanzitutto, configurare il componente Security, in modo da poter usare la protezione CSRF. Il componente Security ha bisogno di un fornitore di token CSRF. Lo si può impostare per usare il fornitore predefinito, disponibile nel componente Form:

  • YAML
    # app/config/security.yml
    security:
        firewalls:
            area_protetta:
                # ...
                form_login:
                    # ...
                    csrf_provider: form.csrf_provider
    
  • XML
    <!-- app/config/config.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="area_protetta">
                <!-- ... -->
    
                <form-login csrf-provider="form.csrf_provider" />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
    // app/config/security.php
    $container->loadFromExtension('security', array(
        'firewalls' => array(
            'area_protetta' => array(
                // ...
                'form_login' => array(
                    // ...
                    'csrf_provider' => 'form.csrf_provider',
                )
            )
        )
    ));
    

Il componente Security può essere ulteriormente configurato, ma queste informazioni sono sufficienti per l’uso di CSRF nel form di login.

Rendere il campo CSRF

Ora che il componente Security verificherà il token CSRF, occorre aggiungere un campo nascosto al form di login, contenente il token CSRF. Per impostazione predefinita, tale campo si chiama _csrf_token. Questo campo nascosto deve contenere il token CSRF, che può essere generato usando la funzione csrf_token. Questa funzione richiede un identificativo per il token, che deve essere impostato per l’autenticazione quando si usa il form di login:

  • Twig
    {# src/Acme/SecurityBundle/Resources/views/Security/login.html.twig #}
    
    {# ... #}
    <form action="{{ path('login_check') }}" method="post">
        {# ... campi del login #}
    
        <input type="hidden" name="_csrf_token"
            value="{{ csrf_token('authenticate') }}"
        >
    
        <button type="submit">login</button>
    </form>
    
  • PHP
    <!-- src/Acme/SecurityBundle/Resources/views/Security/login.html.php -->
    
    <!-- ... -->
    <form action="<?php echo $view['router']->generate('login_check') ?>" method="post">
        <!-- ... campi del login -->
    
        <input type="hidden" name="_csrf_token"
            value="<?php echo $view['form']->csrfToken('authenticate') ?>"
        >
    
        <button type="submit">login</button>
    </form>
    

Dopo di che, il form di login è protetto conto attacchi CSRF.

Suggerimento

Si può cambiare il nome del campo, impostando csrf_parameter e modificare l’identificativo del token, impostando la voce intention nella configurazione:

  • YAML
    # app/config/security.yml
    security:
        firewalls:
            area_protetta:
                # ...
                form_login:
                    # ...
                    csrf_parameter: _csrf_security_token
                    intention: una_stringa_privata
    
  • XML
    <!-- app/config/config.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="area_protetta">
                <!-- ... -->
    
                <form-login csrf-parameter="_csrf_security_token"
                    intention="una_stringa_privata" />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
    // app/config/security.php
    $container->loadFromExtension('security', array(
        'firewalls' => array(
            'area_protetta' => array(
                // ...
                'form_login' => array(
                    // ...
                    'csrf_parameter' => '_csrf_security_token',
                    'intention'      => 'una_stringa_privata',
                )
            )
        )
    ));
    

Tabella dei contenuti

Argomento precedente

Cambiare il comportamento del percorso di rinvio predefinito

Argomento successivo

Scegliere un algoritmo dinamico per la codifica di password

Questa pagina