Pregunta

¿Cuál es la mejor manera de crear pruebas de funcionamiento a las formas de prueba con la protección CSRF habilitado en Symfony?

En la actualidad tengo que añadir el siguiente código antes de cada forma submittion:

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

Luego añadir el token y $ $ token_name a los parámetros de formulario como el siguiente:

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

La opción sugerida en la documentación:

'_with_csrf' => true,

no funciona en absoluto.

¿Hay forma más sencilla para evitar la adición de contadores a cada formulario probado manualmente? ¿O hay una manera de apagar csrf comprobación cuando se ejecutan pruebas?

La forma en que he descrito arriba está bien cuando se tiene a prueba de 1-2 formas, pero si el proyecto contiene decenas de formas únicas que se convierte en un dolor.

¿Fue útil?

Solución

Por supuesto, no se puede utilizar _with_csrf opción si llama directamente la url. Debe pasar de la página del formulario, hacer clic en el botón de envío. De esta manera:

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

La cadena 'signin' debe adaptarse a su forma. También puede utilizar una cadena de más de etiquetas independientes, como 'forma de entrada # myform [type = 'submit']' en lugar de 'signin', la adaptación de la identificación de su formulario.

Como ya se ha sugerido, puede disapble CSRF de inicio de sesión, que es muy útil para las formas que modifica los datos.

Otros consejos

Yo personalmente no uso las pruebas funcionales que extensivamente (probablemente a mi propio detrimento), pero siempre se podía cambiar la protección CSRF fuera en su clase de formulario para propósitos de prueba.

public function configure ()

  $this->disableLocalCSRFProtection();

Se puede desactivar la protección CSRF para todas las formas simplemente añadiendo pase adicional de compilador:

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);
        }
    }
}

O bien, puede desactivar la extensión formulario en su totalidad mediante la adición de configuración:

framework:
    csrf_protection: false

Por cierto, últimas soluciones sólo funciona si usted no tiene la opción de forma explícita conjunto csrf_protection

Me apague CSRF para las pruebas de medio ambiente.

Se debe conseguir un CSRF token mostrando la página, incluyendo el formulario.

$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');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top