Hi i want to create a image captcha with php, i have the next code for my form.
<form action="" method="POST">
<div class="label_form">Usuario:</div> <input type="text" name="user"/><br>
<div class="label_form">Contraseña:</div> <input type="password" name="pass"/><br>
<img alt="Numeros aleatorios" src="layouts/captcha.php" />
<input class="label_form" type="text" name="num"/><br>
<input type="submit" value="ENTRAR" name="submit"/>
</form>
This is the code for validation before to send the form:
if (isset($_POST["submit"])) {
if ($_SESSION['img_number'] != $_POST['num']) {
echo "<div class='msg_error'>Los caracteres no se corresponden.</div>";
} else {
/*DO STUFF*/
}
}
And in other file with the name captcha.php
i have the code phpfor generate the image:
header("Content-type: image/png");
$string = "abcdefghijklmnopqrstuvwxyz0123456789";
for ($i = 0; $i < 5; $i++) {
$pos = rand(0, 36);
$str. = $string {
$pos
};
}
$img_handle = ImageCreate(60, 22) or die("Es imposible crear la imagen");
$back_color = ImageColorAllocate($img_handle, 102, 102, 153);
$txt_color = ImageColorAllocate($img_handle, 255, 255, 255);
ImageString($img_handle, 31, 5, 0, $str, $txt_color);
Imagepng($img_handle);
session_start();
$_SESSION['img_number'] = $str;
This give a image broken showing the alt from img
"Numeros aleatorios"
, so that tell me the file.php
is calling fine the img
but the code for generated is not working, any help is gratefull :D thanks.
Your code is good the only thing you missed is declaring $str = ""
at the top of your catpcha.php
file
Here is a working capture of your code:
Your $string
length is 36, so you should generate a random position between 0 and 35, like this:
$pos = rand(0,35);
If not, you sometimes get a broken image and a PHP Notice.
The reason why you get a broken image without declaring $str = ""
is because this line
$str .= $string{$pos};
Throws a PHP
Notice and corrupts the image. (Of course only if you display_errors , that's why it worked perfectly for @Danny's server)
Try changing:
$str .= $string{$pos};
to
$str .= $string[$pos]; //Array of strings.
I've updated my answer:
<?php
header("Content-type: image/png");
$string = "abcdefghijklmnopqrstuvwxyz0123456789";
for ($i = 0; $i < 5; $i++) {
$pos = rand(0,36);
$str .= $string[$pos];
}
$img_handle = ImageCreate (60, 22) or die ("Es imposible crear la imagen");
$back_color = ImageColorAllocate($img_handle,102,102,153);
$txt_color = ImageColorAllocate($img_handle,255,255,255);
ImageString($img_handle, 31, 5, 0, $str, $txt_color);
Imagepng($img_handle);
session_start();
$_SESSION['img_number'] = $str;
?>
In my local server the captcha image is showing properly.
Use this code in captacha.php, You can try this:
<?php
@session_start();
header("Content-type: image/png");
$_SESSION["captcha"] = substr(md5(time()),0,5);
$im = imagecreate(110, 30);
$white = imagecolorallocate($im, 244, 255, 255);
$red = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
$size = $_SESSION["captcha"];
$text = "$size";
$font = 'comic.TTF';
imagettftext($im, 20, 0, 25, 20, $red, $font, $text);
imagettftext($im, 20, 0, 25, 20, $black, $font, $text);
imagepng($im);
imagedestroy($im);
?>
You need a font like comic.TTF
for image font style.
More details about Captcha in PHP