Frage

Was ist der beste Weg, Funktionstests an Testformen schaffen mit CSRF-Schutz in Symfony aktiviert?

Zur Zeit habe ich vor jeder Form submittion den folgenden Code hinzuzufügen:

  $form = new sfGuardFormSignin();
  $token = $form->getCSRFToken();
  $token_name = $form->getCSRFFieldName();

Dann füge ich das Token $ und $ token_name zu bilden Parameter wie folgt aus:

call('/login', 'POST', array (
    'signin' => 
    array (
      'username' => $username,
      'password' => $password,
      $token_name => $token,
    )))

Die Option in der Dokumentation vorgeschlagen:

'_with_csrf' => true,

nicht funktioniert überhaupt nicht.

Gibt es einfachere Art und Weise zu jedem Formular hinzugefügt Token getestet manuell zu vermeiden? Oder ist es eine Möglichkeit, csrf Überprüfung auszuschalten, wenn Tests ausgeführt werden?

So wie ich oben beschrieben habe, in Ordnung ist, wenn Sie zu Test haben 1-2 Formen, aber wenn Projekt Zehn einzigartige Formen enthält wird es ein Schmerz.

War es hilfreich?

Lösung

Natürlich können Sie nicht _with_csrf Option verwenden, wenn Sie direkt die URL aufrufen. Sie müssen von der Form-Seite übergeben, auf dem Submit-Button klicken. Wie so:

click('signin', array('signin' => array('username' => $username, 'password' => $password), array('_with_csrf' => true)))

Der String ‚signin‘ muss auf dem Formular angepasst werden. Sie können auch eine Label-unabhängige Zeichenfolge, wie verwenden 'form # myform input [type = "submit"]' anstelle von 'signin', die ID des Formulars anpassen.

Wie bereits angedeutet, können Sie CSRF für Login disapble, es ist wirklich nützlich für Formulare, die Daten ändert.

Andere Tipps

Ich benutze persönlich nicht funktionale Tests, die ausgiebig (wahrscheinlich zu meinem eigenen Schaden), aber man konnte immer schalten Sie den CSRF Schutz off in Ihrer Formularklasse für Prüfzwecke.

public function configure ()

  $this->disableLocalCSRFProtection();

Sie können für alle Formen csrf Schutz deaktivieren nur durch Hinzufügen zusätzlicher Compiler Pass:

class CsrfProtectionCompilerPass implements CompilerPassInterface
{
    /**
     * {@inheritdoc}
     */
    public function process(ContainerBuilder $container)
    {
        $env = $container->getParameter('kernel.environment');
        if ($env == 'test') {
            $container->setParameter('form.type_extension.csrf.enabled', false);
        }
    }
}

oder Sie können durch Hinzufügen Config vollständig Form Erweiterung deaktivieren:

framework:
    csrf_protection: false

btw, letzte Lösungen funktionieren nur, wenn Sie müssen nicht explizit Set Form Option csrf_protection

Ich würde off CSRF dreht für Umwelt getestet werden.

Sie sollten eine CSRF-Token von der Seite einschließlich der Form zeigt.

$browser->get('/login');
$dom = new DOMDocument('1.0', $browser->getResponse()->getCharset());
$dom->loadHTML($browser->getResponse()->getContent());
$domCssSelector = new sfDomCssSelector($dom);
$token = $domCssSelector->matchSingle('input[name="_csrf_token"]')->getNode()->getAttribute('value');
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top