Este es el Script al que accede el usuario y que envia el formulario que tiene que rellenar el usuario. El script es autocomentado (Todo el código fuente debería serlo) .
<?php
/*
@author. Carlos García Pérez.
@company. Autentia Real Business Solutions
Este Script inicia la sessión si no estaba iniciada ya y envia el formulario a rellenar al usuario
*/
// Iniciamos la sesión
session_start();
if (! isset($_SESSION["imageText"])){
// No estaba creada la sesión, la creamos.
// Generamos una cadena aleatoria que será la se envie como imagen al usuario.
$_SESSION["imageText"] = generateRandString(4);
}
/**
* Genera una cadena aleatoria de 'numChars' caracteres.
*/
function generateRandString($numChars){
// Quitamos los caracteres {0, 1, i, l, o) pues confunden
// mucho a los usuarios ya que por ejemplo un cero y una o se ven más o menos
// igual.
$chars = "AaBbCcDdEeFfGgHhJjKkMmNnPpQqRrSsTtUuVvWwXxYyZx23456789";
$charsCount = strlen($chars) - 1;
$randString = "";
for ($i=0; $i < $numChars; $i++){
$num = rand(0, $charsCount);
$randString .= $chars[$num];
}
return $randString;
}
?>
<html>
<head>
<title>Autentia Real Business Solutions</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<meta name="author" content="Carlos García Pérez">
</head>
<body>
<form action= "processCommentForm.php" method="post">
<table>
<tr><td colspan="2">Comentarios:</td></tr>
<tr><td colspan="2"><textarea name="txtNotes" cols="40" rows="3"></textarea></td></tr>
<tr>
<td><img src= "getImage.php" /></td>
<td><input type="text" name= "txtRandImage" /></td>
</tr>
<tr><td colspan="2"><input type="submit" name="action" value="Enviar" /></td></tr>
</table>
</form>
</body>
</html>
Este es el Script (getImage.php) genera la imagen asociada a la variable almacenada en sesión. El Script es autocomentado.
<?php
/*
@author. Carlos García Pérez.
@company. Autentia Real Business Solutions
Este script genera la imagen de validación del formulario
*/
session_start();
$imageText = $_SESSION["imageText"];
// Verificamos que el usuario inicio sesión
if (! isset($imageText)){
// El usuario no inicio sessión header("HTTP/1.0 405"); // Recurso no permitido
return;
}
// Constantes que nos harán el código más legible
define("HEIGHT", 30);
define("SPC", 20);
define("WIDTH", (SPC * strlen($imageText)));
define("FONTNAME", "ARIAL.TTF");
define("FONTSIZE", 18);
/* { Generamos la imagen. }
* Nota:
* Esta parte podría ser cambiada para generar una imagen más compleja de
* averiguar por programas de detección de imágenes.
*/
$img = @imagecreate(WIDTH, HEIGHT);
@imagecolorallocate($img, 200, 200, 200);
$black = @imagecolorallocate($img, 0, 0, 0);
@imagerectangle($img, 0, 0, WIDTH - 1, HEIGHT - 1, $black);
for ($i=0, $l = strlen($imageText); $i < $l; $i++){
@imagettftext($img, FONTSIZE, 10, $i*SPC + 2, 26, $black, FONTNAME, $imageText[$i]);
}
// Fin { Generamos la imagen }
// Enviamos la imagen al cliente (Navegador, PDA, Móvil, etc).
// Como veis no se guarda nada en el disco duro pues le enviamos la imagen directamente al cliente.
@imagepng($img);
// Liberamos recursos
@imagedestroy($img);
?>
El siguiente script ( processCommentForm.php ) es el que recibe los datos que se envian desde el formulario. Es autocomentado.
<?php
/*
@author. Carlos García Pérez.
@company. Autentia Real Business Solutions
Este script valida que el texto introducido por el usuario y si es igual al
que estaba guardado en sesión almacenamos los datos en nuestra BD.
*/
session_start();
$imageText = $_SESSION["imageText"];
// Verificamos que el usuario inicio sesión
if (! isset($imageText)){
// El usuario no inicio sessión header("HTTP/1.0 405"); // Recurso no permitido
return;
}
$resultText = "";
// Comprobamos (case-sensitive) que el texto que introdujo el usuario
// es igual al que estaba guardado en sesión. if ( $imageText == $_POST["txtRandImage"] ){
// El usuario introdujo correctamente el valor de la imágen
// Destruimos todas las variables de la sesión y la sesión en si misma.
session_unset();
session_destroy();
// Aquí procesariamos y guardariamos los datos del formulario (vienen en
// $_POST) en nuestras BD o ficheros. (En este ejemplo no lo hacemos).
$resultText = "Validación correcta. Sus comentarios fueron guardados";
} else {
$resultText = "Validación incorrecta. Inténtelo de nuevo";
}
// En este ejemplo simplemente se envia un mensaje al usuario.
?>
<html>
<body>
<?php echo $resultText; ?>
</body>
</html>
Bueno, espero que os haya sido de utilidad este tutorial.
En Autentia , empresa en la cual trabajo, nos gusta compartir el conocimiento. Aquí teneis un poquito más de nuestra aportación. Si algún día necesitais un poco de ayuda con vuestros proyectos o necesitais de formación ya sabéis donde encontrarnos.
Autor: Autentia
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=imgvalidacion
Usuarios que han visto este tema también han visto...
- heredoc en PHP
- Fecha de un día pasado de la semana
- Encriptación de contraseñas en PHP
- Proteger las direcciones de correo en PHP
- Variables variables con PHP
- Versión imprimible de este documento
- Enviar por e-mail este documento