Buenas tardes a Todos, después de andar un poco ocupado hoy vuelvo a tener tiempo para seguir posteando, en esta ocasión vamos a tratar el tema de validación CSRF Token en Symfony 1.4 y Jquery, para más información sobre el tema consultar en el siguiente link:

 

http://es.wikipedia.org/wiki/Cross_Site_Request_Forgery.

 

Problemática
En symfony 1.4 el _csrf_token es reservado para el envió de formularios y para las peticiones link_to. Entonces, ¿si esto es reservado para estos ítems como poder usarlo desde Jquery en cualquier template de nuestros módulos ?

 

Solución
1. tenemos que crear un objeto a partir de la clase BaseForm, el ejemplo de esta solución está orientado a la eliminación de un registro de la DB.

 


<?php $CsrfToken = new BaseForm(); ?>

2. Al tener ya creado el objeto $CsrfToken procedemos a asignar el valor del método getCSRFToken, el cual traerá el código del Token para realizar la petición.


<input type="hidden"  id="tokenCsrf"  value="<? echo $CSRFTokenForm->getCSRFToken(); ?>" />

3. Creamos radios “Estos serán utilizados para seleccionar el id a utilizar” dinámicos a partir del foreach que manipula las filas de la tabla “DB”, para el ejemplo he creado una tabla donde se almacenan los empleados de la empresa.

 


<?php foreach ($employees as $employee): ?>

<input  name="listRows"  type="radio" value="<?php echo $employee->getId() ?>">

<?php endforeach; ?>

4. Ahora creamos un botón para ejecutar el evento desde Jquery.


<input type="button" id="sendToken" value="Eliminar" />

5. En este punto solo nos queda agregar el código Jquery para ejecutar la eliminación teniendo en cuenta la validación Csrf Token.


$('#sendToken').live('click',function(){

if($('input:radio[name="listRows"]').is(':checked'))//verificamos en se haya chequeado algún radio
{
var id    = $('input:radio[name="listRows"]:checked').val();//obtenemos el id del radio seleccionado
var token = $('#tokenCsrf').val();//y el codigo del Token

$.ajax({
type: 'POST',//tipo de envio
url: 'empleados/delete',//url de envio
data: 'id=' + id + '&amp;_csrf_token=' + token,//definimos los datos a enviar

success: function(datos)
{
alert('Registro Eliminado');//salida de informe siempre y cuando la petición se cumpla
}
});

}
else
{
alert('Debe seleccionar algún elemento de la lista');//salida de error si no se a seleccionado ningun radio
}

});

 

Espero que sea de gran utilidad, Gracias…