2011-11-24 164 views
0

我尝试实现PHP图片验证码,这里是test.php文件:检查是否verfication代码是正确

<form method="POST" action="processor.php"> 
    <div style="float:left;">Code: <input type="text" name="verif_box" style="cursor:text">  </div> 
    <div style="margin-top:0px;position:relative;left:5px; top:-8px;"><IMG SRC="image.php"></div> 
    <input type="submit" name="submit" value="Submit"> 
</FORM> 

这里是image.php

$width = 60; 
     $height = 24; 

$my_image = imagecreatetruecolor($width, $height); 

imagefill($my_image, 0, 0, 0xFFFFFF); 

    for ($c = 0; $c < 110; $c++){ 
$x = rand(0,$width-1); 
$y = rand(0,$height-1); 
imagesetpixel($my_image, $x, $y, 0x000000); 
} 

$sessioncode=rand(0,9999); 
    imagestring($my_image, 5, 0, 0, substr(strtoupper(md5("Mytext".$sessioncode)), 0,6),  $textcolor); 
setcookie('tntcon',(md5("Mytext".$sessioncode))); 
imagejpeg($my_image); 
imagedestroy($my_image); 
    exit(); 

这里是processor.php

 $verif_box = $_POST["verif_box"]; 
if (strtoupper($_COOKIE['tntcon']) == strtoupper($verif_box)) { 
    echo "right code"; 
} else { 
    echo "wrong code"; 
    } 

问题是,即使我输入了正确的验证码,我n processor.php文件总是给我“错误的代码”消息,我做错了什么?

+0

我会检查cookie设置是否正确。您是否尝试在打印“正确的代码”的相同行中打印这两个值(cookie和post)? – AJJ

回答

3

您正在存储的不是cookie中的代码,而是代码的完整md5哈希。

setcookie('tntcon',(md5("Mytext".$sessioncode))); 

只存储cookie中的前6个字符。

setcookie('tntcon',(strtoupper(substr(md5("Mytext".$sessioncode), 0, 6)))); 

另一个(更好)选择是存储代码的会议:

//image.php 
session_start(); 
$_SESSION['code'] = strtoupper(substr(md5('Mytext' . $sessioncode), 0, 6)); 

//processor.php 
session_start(); 
if ($_SESSION['code'] == strtoupper($_POST["verif_box"])) { 
    // Correct code 
} else { 
    // Incorrect code 
    unset($_SESSION['code']); 
} 
+0

此外,如果您使用MD5散列作为验证码图像,则会将可用字符集限制为0-9,a-f。最好从完整的字母表和一组数字中产生一个随机码。而对于失败的尝试,不要忘记清除会话中的代码,否则你的验证码可能很容易被暴力破解。 –

+0

感谢您的帮助,我是否需要使用unset()清除会话,如果我想要生成字符和数字的组合,是否需要自己创建一个函数? – smith

+0

@smith我在上面的答案中添加了用于取消设置会话变量的行。要生成由0-9和a-z组成的字母数字代码,请从此问题获取一个函数:http://stackoverflow.com/questions/1837432/how-to-generate-random-password-with-php – trapp

0

你只显示图像中的6个字符,但存储在cookie中的全MD5哈希值。更好的方法是这样的:

$captchacode = substr(strtoupper(md5(rand(234,234234))), 2,6); 
imagestring($my_image, 5, 0, 0, $captchacode,  $textcolor); 
setcookie('tntcon', $captchacode);