验证码脚本在高于 PHP 5.2.17 的版本中无法正常工作
Captacha script not working correctly in versions greater than PHP 5.2.17
下面的 PHP 代码适用于 PHP 5.2.17 和更低版本(如“7YNd5fG”)。但对于比 PHP 5.2.17 更高的版本,它显示所有 7 个字符,如 'NNNNNNN' 或 'yyyyyyy'。
请告诉我我应该在下面的代码中更改或添加什么,以便它在高于 PHP 5.2.17 的版本中正常工作?
以下函数生成具有特定字符的随机文本字符串
function get_image_text($length)
{
$ret_char = "";
$ret_string = "";
for($i =0;$i<$length;$i++)
{
mt_srand((double)microtime()*1000000);
$ret_char = mt_rand(2,3);
switch ($ret_char)
{
case 1: $ret_char = mt_rand(97, 122); break;
case 2: $ret_char = mt_rand(48, 57); break;
case 3: $ret_char = mt_rand(65, 90); break;
}
$ret_string.= chr($ret_char);
}
return $ret_string;
}
get_unique_image.php
session_start();
header("Content-type: image/png");
$str_code=get_image_text(7);
$_SESSION["image_secret_code"] = $str_code;
$im = imagecreatefrompng("../images/unique_image.png");
$white = imagecolorallocate($im,0,0,0);
$font = "arial.ttf";
imagettftext($im, 18, 0, 3, 22, $white, $font, $str_code);
imagepng($im);
imagedestroy($im);
终于在页面上使用了下面的代码。
<img src="./get_unique_image.php" border="0">
您遇到该问题的 PHP 是哪个版本?它适用于 5.5.9、5.6.19 和 7.0.4。
因为$ret_char = mt_rand(2,3);
你永远不会得到小写字符;我不知道那是不是故意的。混合小写字符(即使验证不区分大小写)可以说会使验证码更难被机器人解决,具体取决于多种因素。
无论如何,我重写了该函数,使其更短一些,并使用 mt_rand()
从您的集合中的整个字符列表中选择一个随机值。
function get_image_text($length)
{
// create a string abcdefg....XYZ
$chars = implode('', array_map('chr',
array_merge(range(97,122), range(48, 57), range(65, 90)))
);
$ret_string = "";
for($i = 0; $i < $length; ++$i)
{
// pick a random offset from character string
$ret_string .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $ret_string;
}
下面的 PHP 代码适用于 PHP 5.2.17 和更低版本(如“7YNd5fG”)。但对于比 PHP 5.2.17 更高的版本,它显示所有 7 个字符,如 'NNNNNNN' 或 'yyyyyyy'。
请告诉我我应该在下面的代码中更改或添加什么,以便它在高于 PHP 5.2.17 的版本中正常工作?
以下函数生成具有特定字符的随机文本字符串
function get_image_text($length)
{
$ret_char = "";
$ret_string = "";
for($i =0;$i<$length;$i++)
{
mt_srand((double)microtime()*1000000);
$ret_char = mt_rand(2,3);
switch ($ret_char)
{
case 1: $ret_char = mt_rand(97, 122); break;
case 2: $ret_char = mt_rand(48, 57); break;
case 3: $ret_char = mt_rand(65, 90); break;
}
$ret_string.= chr($ret_char);
}
return $ret_string;
}
get_unique_image.php
session_start();
header("Content-type: image/png");
$str_code=get_image_text(7);
$_SESSION["image_secret_code"] = $str_code;
$im = imagecreatefrompng("../images/unique_image.png");
$white = imagecolorallocate($im,0,0,0);
$font = "arial.ttf";
imagettftext($im, 18, 0, 3, 22, $white, $font, $str_code);
imagepng($im);
imagedestroy($im);
终于在页面上使用了下面的代码。
<img src="./get_unique_image.php" border="0">
您遇到该问题的 PHP 是哪个版本?它适用于 5.5.9、5.6.19 和 7.0.4。
因为$ret_char = mt_rand(2,3);
你永远不会得到小写字符;我不知道那是不是故意的。混合小写字符(即使验证不区分大小写)可以说会使验证码更难被机器人解决,具体取决于多种因素。
无论如何,我重写了该函数,使其更短一些,并使用 mt_rand()
从您的集合中的整个字符列表中选择一个随机值。
function get_image_text($length)
{
// create a string abcdefg....XYZ
$chars = implode('', array_map('chr',
array_merge(range(97,122), range(48, 57), range(65, 90)))
);
$ret_string = "";
for($i = 0; $i < $length; ++$i)
{
// pick a random offset from character string
$ret_string .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $ret_string;
}