PHP, tokens y Forms

Por lo general es una buena practica garantizar la integridad de los datos que se envia desde un formulario a un script en la web, para ello se pueden utilizar varias tecnicas como: solo buscar por datos esperados en los campos del formulario, usar un codigo captcha y en mi opinion una de las mejores tecnicas utilizar un token para validar la integridad de los datos.

para demostracion un pequeño codigo de ejemplo:

<?php
// codigo en el encabezado del form
$randomkey = "suP3rR4nDKeY";
$fixedkey = "123lsdlas345"
$salt = time(); // correspondera a un id que se enviara en un campo oculto
// token debera ir en un campo oculto del formulario.
$token = sha1($randomkey . $fixedkey . $salt);
?>
<input id="id" name="id" type="hidden" value="<?php echo $salt; ?>" />
<input id="token" name="token" type="hidden" value="<?php echo $token; ?>" />

Una vez generado el token este sera validado por el script que recibira la informacion del formulario verificado el token garantizara que los datos son validos y han sido enviados desde nuestro formulario.

Una vez validadas las entradas y teniendo los datos del id y el token se regenera el token para comprobarlo usando las 2 key que se usaron el formulario

// $id_form es el id obtenido del formulario
// $form_token es el token del formulario
$randomkey = "suP3rR4nDKeY";
$fixedkey = "123lsdlas345"
$check_token = sha1($randomkey . $fixedkey . $id_form);
if ($form_token == $check_token ) {
print "form data esta OK";
} else {
die("Token invalido");
}

asi con el uso del token se garantiza la integridad de los datos y su procedencia, si alguien quisiera atacar el form tendria que conocer las llaves y el timestamp que se genera al cargar el form, adicionalmente siempre es recomendable realizar una doble validacion una utilizando javascript y en caso de ser deshabilitado, contar con una validacion php o en el lenguaje que se utilice para procesar el formulario.