¿Qué hace?
Nos sirve para generar un captcha para evitar que robots ingresen en nuestro sistema.
Características a destacar - Cadena aleatoria de 6 carac. (digitos y letras mayusculas/minusculas)
- Los caracteres se muestran en diferentes angulos de manera aleatoria
- Grilla y figuras de fondo para dificultar la comprensión del texto por medio de máquinas
- Tamaño de celdas de grilla aleatorio
¿Cómo se usa?
Código php:
Ver original$captcha = new Captcha();
$captcha->create();
$captcha->send();
Futuras actualizaciones
- Agregar efectos al texto
- Color del texto, grilla, fondo y figuras de fondo aleatorio
Código
Código php:
Ver originaldefine('IM_ELEMENTS_OFFSET', 20); define('IM_RANDOM_POLYGONS', 5); define('IM_POLYGON_POINTS', 3); define('IM_RANDOMSTR_LENGTH', 6); define('IM_SYMBOLS_UBOUND', 59); define('IM_RULECELL_MAXWIDTH', 20); define('IM_RULECELL_MAXHEIGHT', 10);
class Captcha
{
private $im;
private $textcolor;
private $polcolor;
private $bgcolor;
public function __construct()
{
}
public function create()
{
$this->drawBg();
$this->drawRandomPolygons();
$this->drawRule();
$this->drawRandomString();
}
public function send()
{
header('Content-type: image/png'); }
public static function test($postvarname)
{
return ($_SESSION['captcha'] == md5($postvarname)); }
private function drawBg()
{
}
private function drawRandomPolygons()
{
$xstart;
$polygons_drawn = 0;
$xstart = mt_rand(IM_XSTART
, IM_ELEMENTS_OFFSET
); while($polygons_drawn <= IM_RANDOM_POLYGONS)
{
$xstart, mt_rand(5, IM_SIZE_HEIGHT
), ),
IM_POLYGON_POINTS,
$this->polcolor
);
$xstart += IM_ELEMENTS_OFFSET + (IM_ELEMENTS_OFFSET / 2);
$polygons_drawn++;
}
}
private function drawRule()
{
$xoffset;
$yoffset;
while($xpos <= IM_SIZE_WIDTH)
{
$xoffset = mt_rand(1, IM_RULECELL_MAXWIDTH
); // 1 COMO VALOR MINIMO PARA QUE NO SE ESCRIBA UNA LINEA ENCIMA DE OTRA imageline($this->im, $xpos, 0, $xpos, IM_SIZE_HEIGHT
, $this->textcolor); $xpos += $xoffset;
}
while($ypos <= IM_SIZE_HEIGHT)
{
$yoffset = mt_rand(1, IM_RULECELL_MAXHEIGHT
); // 1 COMO VALOR MINIMO PARA QUE NO SE ESCRIBA UNA LINEA ENCIMA DE OTRA imageline($this->im, 0, $ypos, IM_SIZE_WIDTH
, $ypos, $this->textcolor); $ypos += $yoffset;
}
}
private function drawRandomString()
{
$symbols = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomstr;
$chars;
$char;
$chars = 0;
$xpos = IM_STRING_XPOS; // COMIENZA A ESCRIBIR EN ESTA POSICION
while($chars < IM_RANDOMSTR_LENGTH)
{
$char = $symbols[(int
)mt_rand(0, IM_SYMBOLS_UBOUND
)]; $randomstr .= $char;
imagettftext($this->im, IM_FONTSIZE
, mt_rand(-IM_CHAR_ANGLE
, IM_CHAR_ANGLE
), $xpos, IM_STRING_YPOS
, $this->textcolor, 'TTF/Vera.ttf', $char); $xpos += IM_FONTSIZE;
$chars++;
}
// GUARDAMOS ENCRIPTADA LA CADENA GENERADA
$_SESSION['captcha'] = md5($randomstr); }
}
Espero que a alguien le sea útil esta otra alternativa para generar un captcha. Cualquier sugerencia, duda, mejora, crítica, etc. haganmelo saber.
Saludos.