验证码脚本在高于 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;
}