这个PHP脚本有什么问题吗? (验证码)

时间:2011-06-26 17:43:36

标签: php captcha

我正在尝试将简单的验证码添加到hml表单中。代码最初来自here

这是生成图像并存储captcha变量的PHP脚本:

<?php

session_start();

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 

header("Cache-Control: no-store, no-cache, must-revalidate"); 

header("Cache-Control: post-check=0, pre-check=0", false);

header("Pragma: no-cache"); 



function _generateRandom($length=6)

{

    $_rand_src = array(

        array(48,57) //digits

        , array(97,122) //lowercase chars

//      , array(65,90) //uppercase chars

    );

    srand ((double) microtime() * 1000000);

    $random_string = "";

    for($i=0;$i<$length;$i++){

        $i1=rand(0,sizeof($_rand_src)-1);

        $random_string .= chr(rand($_rand_src[$i1][0],$_rand_src[$i1][1]));

    }

    return $random_string;

}



$im = @imagecreatefromjpeg("captcha.jpg"); 

$rand = _generateRandom(3);

$_SESSION['captcha'] = $rand;

ImageString($im, 5, 2, 2, $rand[0]." ".$rand[1]." ".$rand[2]." ", ImageColorAllocate ($im, 0, 0, 0));

$rand = _generateRandom(3);

ImageString($im, 5, 2, 2, " ".$rand[0]." ".$rand[1]." ".$rand[2], ImageColorAllocate ($im, 255, 0, 0));

Header ('Content-type: image/jpeg');

imagejpeg($im,NULL,100);

ImageDestroy($im);

?>

这是验证输入的验证码的脚本:

<?php

if($_SESSION["captcha"]==$_POST["captcha"])

{

    //CAPTHCA is valid; proceed the message: save to database, send by e-mail ...

    echo 'CAPTHCA is valid; proceed the message';

}

else

{

    echo 'CAPTHCA is not valid; ignore submission';

}

?>

问题是会话似乎只存储了3个字符,因此值永远不会匹配 - 因为生成的图像有6个字符。

上面的代码有点奇怪(我必须承认我没有使用图像库API)。但是我不知道为什么我们用arg值为3调用_generateRandom(),以及为什么要对imagestring进行两次调用?

4 个答案:

答案 0 :(得分:2)

在CAPTCHA输入旁边显示以下文字: “输入3个黑色符号(忽略红色符号)”

:d

由于只有黑色字符存储在会话中。

更新:我检查了您提供的链接,其中包含以下文字: “(反垃圾邮件代码,3个黑色符号)”在CAPTCHA输入框上方。

答案 1 :(得分:1)

您正在使用

进行初始化
$rand = _generateRandom(3);

$_SESSION['captcha'] = $rand;

生成图像
ImageString($im, 5, 2, 2, $rand[0]." ".$rand[1]." ".$rand[2]." ", ImageColorAllocate ($im, 0, 0, 0));

$rand = _generateRandom(3);

ImageString($im, 5, 2, 2, " ".$rand[0]." ".$rand[1]." ".$rand[2], ImageColorAllocate ($im, 255, 0, 0));

然后第二个$ rand没有存储在$_SESSION

答案 2 :(得分:1)

如果您不想使用“仅黑色数字”功能,只需添加

即可
$_SESSION['captcha'] .= $rand;

在第二次致电ImageString之后。

答案 3 :(得分:1)

这是解决方案(原始代码是f00ked!):

这将教我尝试通过“解除”互联网代码来偷工减料:p

存储验证码的代码部分应该像这样重写:

<?php
$rand1 = _generateRandom(3);

imagestring($im, 5, 2, 2, $rand1[0]." ".$rand1[1]." ".$rand1[2]." ", imagecolorallocate($im, 0, 0, 0));

$rand2 = _generateRandom(3);
imagestring($im, 5, 2, 2, " ".$rand2[0]." ".$rand2[1]." ".$rand2[2], imagecolorallocate($im, 255, 0, 0));
imagejpeg($im,null,100);

$value_to_store = $rand1[0].$rand2[0].$rand1[1].$rand2[1].$rand1[2].$rand2[2];

?>