我正在尝试将简单的验证码添加到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进行两次调用?
答案 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];
?>