25-03-2009 Luis Artola
De forma bastante sencilla, alguien podría atacar tu web intentando hacer un envio POST de un formulario tuyo infinitas veces. Afortunadamente existe una manera sencilla de prevenirlo. Se trata de que cuando alguien haga una petición GET sobre el formulario (para que éste se cargue), el sistema genere una clave aleatoria (token) que se añada como campo hidden al formulario y se guarde como variable de sesión. Al enviar un POST sobre el formulario, se comprobará si el token hidden es igual a lo guardado en sesión. Si es así, se considerará que se cargó primero el formulario antes de enviarlo, así que no se trata de un envío POST directo.
Por supuesto, esto no convierte en invulnerables los formularios. Existen otras muchas maneras de intentar atacarlos, pero si reduce las posibilidades de un ataque básico.
A continuación voy a extender el objeto Zend_Form del Zend Framework para incluir un par de métodos que ayudarán a la generación y validación del token.
<?php class Zend_Form_Token extends Zend_form { //generamos el token y lo guardamos en una variable de sesion. protected function generateToken ($seed = 'cocotero'){ $token = md5($seed.mktime()); $globalSession = new Zend_Session_Namespace('global_data'); $globalSession->token = $token; return $token; } //cuando recibamos un envío post, le pasaremos la variable input hidden del token a ésta función para validarlo. protected function tokenCheck($tokenToCheck=''){ $globalSession = new Zend_Session_Namespace('global_data'); $returnValue = (!empty($tokenToCheck) and $tokenToCheck == $globalSession->token); return $returnValue; } }// Zend_Form_Token ?>
Ahora sólo nos queda crear nuestros formularios y llamar a éstas funciones en el controller correspondiente, para poder controlar la respuesta…
1. necudeco | marzo 25th, 2009 at 2:25 pm
Ahora para atarcanos van a descargar el formulario con una herramienta como wget, analizarlo y luego enviar los datos.
A mi sencillo juicio, no da ninguna seguridad y encima sinos quieren atacar … nos consume mas ancho de banda.
2. Luis Artola | marzo 25th, 2009 at 6:47 pm
Hola Necudeco,
es evidente que si alguien intenta hackear un formulario activamente, le dará igual el token o no token. Pero es una técnica interesante para deshacerse de los robots spammers más básicos…
Un saludo!
3. Isra | abril 11th, 2009 at 4:00 pm
“Ahora para atarcanos van a descargar el formulario con una herramienta como wget, analizarlo y luego enviar los datos.”
Eso les exigirá descargarse la página a cada vez, lo que implica un coste que seguramente los bots no estén dispuestos a asumir.