csrf token: Required, ayuda con validación.

1,253 views
Skip to first unread message

Pablo Braulio

unread,
Oct 11, 2010, 1:06:56 PM10/11/10
to symfony-es
Hola a todos.

Estoy haciendo por primera vez en sf 1.4 un formulario a mano, y me
encuentro con el siguiente error al validarlo. Pese a que los dem�s
campos cumplan con los requisitos de la validaci�n, este error siempre sale.

�Alguien sabe como solucionarlo?.

Os pego el c�digo.

acction.class.php
public function executeIndex(sfWebRequest $request)
{
$this->form= new Public_Users_ItemForm();

#Validaci�n.
if($request->isMethod('post')){
$this->form->bind($request->getParameter('login'));


if($this->form->isValid()){
$this->redirect('login/login?'.
http_build_query($this->form->getValues()));
}
}
}

indexSuccess.php

<?php use_stylesheets_for_form($form) ?>
<?php use_javascripts_for_form($form) ?>
</script>
<?php slot('title', ' Formulario de acceso.'); ?>
<div id="containerLogin">
<div class="header">
<h1>Formulario de acceso</h1>
</div>
<div id="content">
<?php echo form_tag('login/index') ?>
<div id="form">
<div id="fieldset">
<table style="width: 100%;">
<?php echo $form['_csrf_token']; ?>
<?php echo $form ?>
<tr>
<td colspan="2">
<div class="action">
<ul>
<li>
<button type="submit">
<span class="icon"></span>
Acceder
</button>
</li>
</ul>
</div>
</td>
</tr>
<tr>
<td>
<div class="action">
<?php echo link_to('Registrarse',
'constantes/registrarse') ?>
</div>
</td>
<td>
<div class="action_right">
<?php echo link_to('�Has olvidado la
contrase�a?', 'constantes/passwordNuevo') ?>
</div>
</td>
</tr>
</table>
</div>
</div>

</form>
</div>
</div>

Public_Users_Item.class.php

class Public_Users_ItemForm extends BasePublic_Users_ItemForm
{
public function configure()
{
$this->setWidgets(array(
'usuario'=> new sfWidgetFormInputText(array(),
array('maxlength'=>20)),
'passwd' => new sfWidgetFormInputPassword(array(),
array('maxlength'=>50))
));

$this->widgetSchema->setLabels(array(
'usuario'=> 'Usuario',
'passwd' => 'Contrase�a'
));

$this->setValidators(array(
'usuario' => new sfValidatorString(array(),
array('required'=>'Introduce un usuario.')),
'passwd' => new sfValidatorString(array(),
array('required'=>'Introduce la contrase�a.'))
));

}
}


--
Saludos cordiales.
Pablo.

Si lo reenv�as, ten la precauci�n de borrar los datos de procedencia que
encabezar�an tu reenv�o � empezando por mi direcci�n de correo
electr�nico - . Coloca siempre las direcciones de tus contactos en el
campo <CCO> para que viajen discretas, no en el campo <Para> ni en
el<CC>. De esa forma nadie que lo reciba tendr� constancia de las se�as
de los dem�s destinatarios a los que tambi�n se remite. Todo ello a fin
de evitar que nadie se aproveche de todas las direcciones que se van
acumulando al pasar de buz�n a buz�n para el lanzamiento de correo
basura y otras indeseadas lindezas. Aparte claro est� de garantizar la
privacidad.

Gracias.

Alain Sanchez Gutierrez

unread,
Oct 11, 2010, 4:50:53 PM10/11/10
to symfony-es
Hola, tienes dos soluciones para resolver ese problema:
1.- incluye en la clase del formulario Public_Users_ItemForm en el
método configure() lo siguiente:
[code]
parent::configure();
$this->disableLocalCSRFProtection();
[/code]

2.- incluye en el código de la vista del formulario antes del boton
submit, o sea en indexSuccess.php, según el código que presentas lo
siguiente:
$form->renderHiddenFields();

_________________
Atentamente...
Ing. Alain Sánchez Gutiérrez
emial: brazzi[arroba]brazzisoft.com
cell: 005353339528 / +5353339528
url: http://www.brazzisoft.com
fb: http://www.facebook.com/mr.brazzi

On 11 oct, 13:06, Pablo Braulio <brul...@gmail.com> wrote:
> Hola a todos.
>
> Estoy haciendo por primera vez en sf 1.4 un formulario a mano, y me
> encuentro con el siguiente error al validarlo. Pese a que los dem s
> campos cumplan con los requisitos de la validaci n, este error siempre sale.
>
> Alguien sabe como solucionarlo?.
>
> Os pego el c digo.
>
> acction.class.php
>    public function executeIndex(sfWebRequest $request)
>    {
>      $this->form= new Public_Users_ItemForm();
>
>      #Validaci n.
>                              <?php echo link_to(' Has olvidado la
> contrase a?', 'constantes/passwordNuevo') ?>
>                          </div>
>                      </td>
>                  </tr>
>              </table>
>          </div>
>         </div>
>
>          </form>
>      </div>
> </div>
>
> Public_Users_Item.class.php
>
> class Public_Users_ItemForm extends BasePublic_Users_ItemForm
> {
>    public function configure()
>    {
>        $this->setWidgets(array(
>            'usuario'=> new sfWidgetFormInputText(array(),
> array('maxlength'=>20)),
>            'passwd' => new sfWidgetFormInputPassword(array(),
> array('maxlength'=>50))
>        ));
>
>        $this->widgetSchema->setLabels(array(
>            'usuario'=> 'Usuario',
>            'passwd' => 'Contrase a'
>        ));
>
>        $this->setValidators(array(
>            'usuario' => new sfValidatorString(array(),
> array('required'=>'Introduce un usuario.')),
>            'passwd' => new sfValidatorString(array(),
> array('required'=>'Introduce la contrase a.'))
>        ));
>
>    }
>
> }
>
> --
> Saludos cordiales.
> Pablo.
>
> Si lo reenv as, ten la precauci n de borrar los datos de procedencia que
> encabezar an tu reenv o empezando por mi direcci n de correo
> electr nico - . Coloca siempre las direcciones de tus contactos en el
> campo <CCO> para que viajen discretas, no en el campo <Para> ni en
> el<CC>. De esa forma nadie que lo reciba tendr constancia de las se as
> de los dem s destinatarios a los que tambi n se remite. Todo ello a fin
> de evitar que nadie se aproveche de todas las direcciones que se van
> acumulando al pasar de buz n a buz n para el lanzamiento de correo
> basura y otras indeseadas lindezas. Aparte claro est de garantizar la
> privacidad.
>
> Gracias.

Pablo Braulio

unread,
Oct 11, 2010, 5:57:24 PM10/11/10
to symfo...@googlegroups.com
Hola.

Seg�n veo lo primero que me pones lo que hace es desactivar la protecci�n.

La segunda opci�n da el mismo error.

Creo que mi problema es que no se est� aplicando la validaci�n, pues lo
que trata de validar es que los campos tengan datos, y siempre da error
como si estuvieran vac�os.


El 11/10/10 22:50, Alain Sanchez Gutierrez escribi�:


> Hola, tienes dos soluciones para resolver ese problema:
> 1.- incluye en la clase del formulario Public_Users_ItemForm en el

> m�todo configure() lo siguiente:


> [code]
> parent::configure();
> $this->disableLocalCSRFProtection();
> [/code]
>

> 2.- incluye en el c�digo de la vista del formulario antes del boton
> submit, o sea en indexSuccess.php, seg�n el c�digo que presentas lo


> siguiente:
> $form->renderHiddenFields();
>
> _________________
> Atentamente...

> Ing. Alain S�nchez Guti�rrez


> emial: brazzi[arroba]brazzisoft.com
> cell: 005353339528 / +5353339528
> url: http://www.brazzisoft.com
> fb: http://www.facebook.com/mr.brazzi
>

--
Saludos cordiales.
Pablo.

Si lo reenv�as, ten la precauci�n de borrar los datos de procedencia que

encabezar�an tu reenv�o � empezando por mi direcci�n de correo

electr�nico - . Coloca siempre las direcciones de tus contactos en el

campo <CCO> para que viajen discretas, no en el campo <Para> ni en

el<CC>. De esa forma nadie que lo reciba tendr� constancia de las se�as

de los dem�s destinatarios a los que tambi�n se remite. Todo ello a fin

de evitar que nadie se aproveche de todas las direcciones que se van

acumulando al pasar de buz�n a buz�n para el lanzamiento de correo
basura y otras indeseadas lindezas. Aparte claro est� de garantizar la
privacidad.

Gracias.

chus

unread,
Oct 12, 2010, 7:38:27 AM10/12/10
to symfony-es
no he visto que tengas la etiqueta <form action="<?php echo
url_for('modulo/index')?>"> pero si tienes </form>
ni tampoco el ->render() en <?php echo $form['_csrf_token']-
>render(); ?>
<?php echo $form ?>

aunke esto ultimo no tiene importancia si haces lo de $form-
>renderHiddenFields();




Julian Lasso

unread,
Oct 12, 2010, 8:20:18 AM10/12/10
to symfony-es
pero tiene esto

<?php echo form_tag('login/index') ?>
y creo que eso lo reemplaza ¿no?





--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/symfony-es?hl=es.




--
"Software is like sex: it's better when it's free" - "El software es cómo el sexo: es mejor cuando es gratis" (Linus Torvalds, creador del Linux)

Pablo Braulio

unread,
Oct 12, 2010, 8:30:51 AM10/12/10
to symfo...@googlegroups.com
Realmente creo que es lo mismo.

Es una herencia de cuando programa en sf 1.0

No se si est� depreciado.
El 12/10/10 14:20, Julian Lasso escribi�:


> pero tiene esto
> <?php echo form_tag('login/index') ?>

> y creo que eso lo reemplaza �no?

chus

unread,
Oct 12, 2010, 8:37:35 AM10/12/10
to symfony-es
si es verdad!!!! no me habia fijado....

no se... yo siempre utilizo el metodo que te he dicho y no me da
problemas...
es posible ke te de ese problema porke solo estas mostrando dos tokens
distintos.... primero cundo lo especificas en <?php echo
$form['_csrf_token']; ?> y despues cuando muestras todo el formularo
<?php echo $form; ?>, se supone ke si pones solo lo segundo, ya va
incluido el campo de token...

Pablo Braulio

unread,
Oct 12, 2010, 9:02:37 AM10/12/10
to symfo...@googlegroups.com
Si, pero es que creo que el problema es como validar eso.

Ya me han comentado como desactivarlo, pero no como validarlo.

�Alguna idea?.


El 12/10/10 14:37, chus escribi�:

Jesus Garcia

unread,
Oct 12, 2010, 9:17:09 AM10/12/10
to symfo...@googlegroups.com
no me has entendido.... si eliminas la linea de codigo <?php echo from['token'];?> no lo inavilitas pues si haces <?php echo from;?> sin los corchetes, symfony imprime todos los campos de ese formulario, incluidos los campos ocultos entre los ke se enckuentra el campo de token.... no se si me explico bien...


ejemplo:
      mostrar todos los campos = <?php echo $form ;?>

     mostrar campo a campo = <?php echo $form['nombre del campo']->render();?>

tu haces las dos cosas,,, con lo cual le estas pasando dos veces el campo token

creo ke el error te viene por eso....


 El 12 de octubre de 2010 15:02, Pablo Braulio <bru...@gmail.com> escribió:
Si, pero es que creo que el problema es como validar eso.

Ya me han comentado como desactivarlo, pero no como validarlo.

¿Alguna idea?.


El 12/10/10 14:37, chus escribió:

si es verdad!!!! no me habia  fijado....

no se... yo siempre utilizo el metodo que te he dicho y no me da
problemas...
es posible ke te de ese problema porke solo estas mostrando dos tokens
distintos.... primero cundo lo especificas en<?php echo
$form['_csrf_token']; ?>   y despues cuando muestras todo el formularo
<?php echo $form; ?>, se supone ke si pones solo lo segundo, ya va
incluido el campo de token...



--
Saludos cordiales.
Pablo.

Si lo reenvías, ten la precaución de borrar los datos de procedencia que encabezarían tu reenvío – empezando por mi dirección de correo electrónico - . Coloca siempre las direcciones de tus contactos en el campo <CCO> para que viajen discretas, no en el campo <Para> ni en el<CC>. De esa forma nadie que lo reciba tendrá constancia de las señas de los demás destinatarios a los que también se remite. Todo ello a fin de evitar que nadie se aproveche de todas las direcciones que se van acumulando al pasar de buzón a buzón para el lanzamiento de correo basura y otras indeseadas lindezas. Aparte claro está de garantizar la privacidad.



Gracias.

Gustavo Adrian

unread,
Oct 12, 2010, 9:19:02 AM10/12/10
to symfo...@googlegroups.com
El token CSRF lo valida automaticamente el formulario (a menos que desactives la proteccion CSRF del form). El problema que tienes puede ser, como indica chun, que al hacer "echo $form" ya estas imprimiendo el campo del token csrf. Por lo que veo estas imprimiendolo aparte tambien haciendo "<?php echo $form['_csrf_token']; ?>". Elimina esa linea y verifica si funciona. Si sigue sin funcionar, fijate que valores estas enviando via POST con Firebug o alguno similar y muestranos.


Saludos.

2010/10/12 Pablo Braulio <bru...@gmail.com>
Si, pero es que creo que el problema es como validar eso.

Ya me han comentado como desactivarlo, pero no como validarlo.

¿Alguna idea?.


El 12/10/10 14:37, chus escribió:

si es verdad!!!! no me habia  fijado....

no se... yo siempre utilizo el metodo que te he dicho y no me da
problemas...
es posible ke te de ese problema porke solo estas mostrando dos tokens
distintos.... primero cundo lo especificas en<?php echo
$form['_csrf_token']; ?>   y despues cuando muestras todo el formularo
<?php echo $form; ?>, se supone ke si pones solo lo segundo, ya va
incluido el campo de token...



--
Saludos cordiales.
Pablo.

Si lo reenvías, ten la precaución de borrar los datos de procedencia que encabezarían tu reenvío – empezando por mi dirección de correo electrónico - . Coloca siempre las direcciones de tus contactos en el campo <CCO> para que viajen discretas, no en el campo <Para> ni en el<CC>. De esa forma nadie que lo reciba tendrá constancia de las señas de los demás destinatarios a los que también se remite. Todo ello a fin de evitar que nadie se aproveche de todas las direcciones que se van acumulando al pasar de buzón a buzón para el lanzamiento de correo basura y otras indeseadas lindezas. Aparte claro está de garantizar la privacidad.



Gracias.

--

Pablo Braulio

unread,
Oct 12, 2010, 9:30:44 AM10/12/10
to symfo...@googlegroups.com
Si, ese era el problema.

Muchas gracias.

El 12/10/10 15:19, Gustavo Adrian escribi�:


> El token CSRF lo valida automaticamente el formulario (a menos que
> desactives la proteccion CSRF del form). El problema que tienes puede
> ser, como indica chun, que al hacer "echo $form" ya estas imprimiendo el
> campo del token csrf. Por lo que veo estas imprimiendolo aparte tambien
> haciendo "<?php echo $form['_csrf_token']; ?>". Elimina esa linea y
> verifica si funciona. Si sigue sin funcionar, fijate que valores estas
> enviando via POST con Firebug o alguno similar y muestranos.
>
>
> Saludos.
>


--
Saludos cordiales.
Pablo.

Si lo reenv�as, ten la precauci�n de borrar los datos de procedencia que

encabezar�an tu reenv�o � empezando por mi direcci�n de correo

electr�nico - . Coloca siempre las direcciones de tus contactos en el

campo <CCO> para que viajen discretas, no en el campo <Para> ni en

el<CC>. De esa forma nadie que lo reciba tendr� constancia de las se�as

de los dem�s destinatarios a los que tambi�n se remite. Todo ello a fin

de evitar que nadie se aproveche de todas las direcciones que se van

acumulando al pasar de buz�n a buz�n para el lanzamiento de correo
basura y otras indeseadas lindezas. Aparte claro est� de garantizar la
privacidad.

Gracias.

Pablo Braulio

unread,
Oct 12, 2010, 2:42:58 PM10/12/10
to symfo...@googlegroups.com
Pues ahora me encuentro con otro problemilla.

Si como dices el CSRF se valida autom�ticamente, no entiendo el porqu�
cuando trato de ejecutar la acci�n borrar (de batch actions, de un
m�dulo creado con generate-admin), me da el mismo error o similar.

500 | Internal Server Error | sfValidatorErrorSchema
_csrf_token [CSRF attack detected.]

En este caso no he modificado los validadores en el formulario. Est�n
los que admin establece por defecto.

El 12/10/10 15:19, Gustavo Adrian escribi�:

> El token CSRF lo valida automaticamente el formulario (a menos que
> desactives la proteccion CSRF del form). El problema que tienes puede
> ser, como indica chun, que al hacer "echo $form" ya estas imprimiendo el
> campo del token csrf. Por lo que veo estas imprimiendolo aparte tambien
> haciendo "<?php echo $form['_csrf_token']; ?>". Elimina esa linea y
> verifica si funciona. Si sigue sin funcionar, fijate que valores estas

> enviando via POST con Firebug o alguno similar y muestranos.)
>
>
> Saludos.
>


--
Saludos cordiales.
Pablo.

Si lo reenv�as, ten la precauci�n de borrar los datos de procedencia que

encabezar�an tu reenv�o � empezando por mi direcci�n de correo

electr�nico - . Coloca siempre las direcciones de tus contactos en el

campo <CCO> para que viajen discretas, no en el campo <Para> ni en

el<CC>. De esa forma nadie que lo reciba tendr� constancia de las se�as

de los dem�s destinatarios a los que tambi�n se remite. Todo ello a fin

de evitar que nadie se aproveche de todas las direcciones que se van

acumulando al pasar de buz�n a buz�n para el lanzamiento de correo
basura y otras indeseadas lindezas. Aparte claro est� de garantizar la
privacidad.

Gracias.

Jesus Garcia

unread,
Oct 12, 2010, 3:23:53 PM10/12/10
to symfo...@googlegroups.com
yo para borrar un registro lo ke hago es :

1- selecciono el regitro con :

$request->getParameter('idObjeto');
$registro= Doctrine::getTable('nobre_tabla')->findOneBy('id',idObjeto);

2- borro con:
$registro->delete();

Gustavo Adrian

unread,
Oct 12, 2010, 3:33:00 PM10/12/10
to symfo...@googlegroups.com
Para facilitar un poco las cosas, podrias poner aqui la accion a la cual apunta el form y las variables que se estan enviando via POST cuando envias el form batch? para ver el formato de nombres que tienen los campos y para verificar que efectivamente se esta enviando el token CSRF de ese form.




2010/10/12 Jesus Garcia <jesusgar...@gmail.com>

--

Pablo Braulio

unread,
Oct 12, 2010, 3:33:48 PM10/12/10
to symfo...@googlegroups.com
�Pero eso lo haces en los modulos creados con generate-admin?.

De todos modos yo me refer�a al borrado multiple.


El 12/10/10 21:23, Jesus Garcia escribi�:

> --
> Has recibido este mensaje porque est�s suscrito al grupo "symfony-es" de
> Grupos de Google.
> Para publicar una entrada en este grupo, env�a un correo electr�nico a
> symfo...@googlegroups.com.
> Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a
> symfony-es+...@googlegroups.com
> Para tener acceso a m�s opciones, visita el grupo en
> http://groups.google.com/group/symfony-es?hl=es.


Reply all
Reply to author
Forward
0 new messages