Captacha脚本在大于PHP 5.2.17的版本中无法正常工作

时间:2016-03-12 05:36:39

标签: php captcha

以下PHP代码适用于PHP 5.2.17及更低版本(例如' 7YNd5fG')。但是对于比PHP 5.2.17更高的版本,它显示的所有7个字符都相同,如NNNNNNN'或者' yyyyyyy'。

请让我知道我应该更改或添加以下代码,以便它在高于PHP 5.2.17的版本中正常工作?

下面的函数会生成带有特定字符的随机文本字符串

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);

get_unique_image.php

<img src="./get_unique_image.php" border="0">

最后在页面上使用下面的代码。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int sum = 0;
int min = 0;
int max = 0;
int temp[25];
int i = 0;
float avg = 0;


int main () {


srand( (unsigned) time(NULL) );

for (i=0; i < 25; i++) {

get_value(i);
sum += temp[i];

}

calc_results(temp[25]);

return 0;
};



int get_value(void) {
    return((rand() % (100 - 60 + 1)) + 60);

};



int calc_results(int temp_number[], int number) {

avg = ((sum)/(25));
max = temp[0];
  for(i=1;i<25;i++){
      if(max<temp[i])
           max=temp[i];
        };
min =temp[0];
  for(i=1;i<25;i++){
      if(min>temp[i])
           min=temp[i];
  };

printf("Temperature Conditions on October 9, 2015 : \n");
printf("Time of day     Temperature in degrees F \n");
printf("     0                        %d\n",temp[0]);
printf("     1                        %d\n",temp[1]);
printf("     2                        %d\n",temp[2]);
printf("     3                        %d\n",temp[3]);
printf("     4                        %d\n",temp[4]);
printf("     5                        %d\n",temp[5]);
printf("     6                        %d\n",temp[6]);
printf("     7                        %d\n",temp[7]);
printf("     8                        %d\n",temp[8]);
printf("     9                        %d\n",temp[9]);
printf("     10                       %d\n",temp[10]);
printf("     11                       %d\n",temp[11]);
printf("     12                       %d\n",temp[12]);
printf("     13                       %d\n",temp[13]);
printf("     14                       %d\n",temp[14]);
printf("     15                       %d\n",temp[15]);
printf("     16                       %d\n",temp[16]);
printf("     17                       %d\n",temp[17]);
printf("     18                       %d\n",temp[18]);
printf("     19                       %d\n",temp[19]);
printf("     20                       %d\n",temp[20]);
printf("     21                       %d\n",temp[21]);
printf("     22                       %d\n",temp[22]);
printf("     23                       %d\n",temp[23]);
printf("     24                       %d\n",temp[24]);
printf("     25                       %d\n",temp[25]);
printf("Maximum Temperature for the day: %d Degrees F\n", max);
printf("Minimum Temperature for the day: %d Degrees F\n", min);
printf("Average Temperature for the day: %.1f Degrees F\n", avg);

};

1 个答案:

答案 0 :(得分: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;
}