什么是用PHP来验证验证码的最佳方法?

时间:2012-01-06 13:42:45

标签: php random captcha

生成随机验证码以避免附加恶意机器人的最佳方法是什么?

方式1:

function _generateRandom( $length = 4, $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ) {
    return substr( str_shuffle( $chars ), 0, $length );
}

方式2:

function _generateRandom($length=4)
{
    $_rand_src = array(
        array(48,57) //digits
        , array(97,122) //lowercase 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;
}

或方式3 ...

或者不介意随机过程...

我仍然不知道机器人如何猜测生成的随机单词,以便他们仍然可以提交帖子表单?

2 个答案:

答案 0 :(得分:0)

如果你在表单中附加CAPTCHA的值,那么机器人可以读取它......:)

机器人还可以读取图像,并且在某些情况下使用称为光学字符识别(OCR)的非常常见的技术将图像解释为字母。这就是为什么许多CAPTCHA被混淆和扭曲,以尝试混淆OCR算法

如果你想生成随机字符,这里是我的函数

# Generate random characters
# @param $l = length
# @param $s = use symbols?
# @param $a = use alphabetical?
# @param $n = use numbers?

function rand_chars($l=8,$s=1,$a=1,$n=1) {
  $string = ''; $chars = array();
  if ($s) $chars = array_merge($chars,array(
                     33,35,36,37,38,40,41,42,43,44,45,
                     46,47,58,59,60,61,62,63,64,91,93,
                     94,95,123,124,125,126
                     ));
  if ($a) $chars = array_merge($chars,array(
                     65,66,67,68,69,70,71,72,73,74,
                     75,76,77,78,79,80,81,82,83,84,
                     85,86,87,88,89,90,
                     97,98,99,100,101,102,103,104,105,106,
                     107,108,109,110,111,112,113,114,115,116,
                     117,118,119,120,121,122
                     ));
  if ($n) $chars = array_merge($chars,array(
                     48,49,50,51,52,53,54,55,56,57
                     ));
  for ($i=0;$i<$l;$i++) {shuffle($chars);$string.=chr(reset($chars));}
  return $string;
  }

答案 1 :(得分:0)

机器人不会猜测你的算法,但会尝试阅读可见的内容。我假设你没有回应你的字符串,如果你这样做,就像没有验证码一样。另一个经常出现的错误是,人们为生成的字符串加载图像,并为图像命名(或替代)与表示它的扭曲字符完全相同。这也不会很好。