2

reCaptcha 现在很难阅读(实际上是破译)。所以我正在寻找一个替代的验证码系统来使用。

我正在考虑使用一个简单的基于数学的系统,例如:“ What is 2+5”。

有没有这样的插件,或者,关于如何构建我自己的想法?

(不是像这样复杂的数学)

4

5 回答 5

2

PHP - 生成一个简单的加法或减法数学问题,在显示数字(10 - 3)和单词(七加五)之间随机交替,并接受数字(14)或单词(十四)的答案。返回一个表示方程分量的数组

[0] - 第一个变量值,作为字符串,如 '4' 或 'four' [1] - 第二个值,运算符,如 '+' 或 'plus' [2] - 第三个值,第二个变量,如'10' 或 '10' [3] - 答案,数字形式,如 '14' [4] - 答案,文本形式,如 '十四'

所以只需将方程打印到页面上,将数组存储在 $_SESSION 中,然后检查用户提供的答案。

<?php

// array of numbers and their corresponding word versions
// you can simply do $wordNumbers[6] and get 'six'
$wordNumbers = array(
    0 => 'zero',
    1 => 'one',
    2 => 'two',
    3 => 'three',
    4 => 'four',
    5 => 'five',
    6 => 'six',
    7 => 'seven',
    8 => 'eight',
    9 => 'nine',
    10 => 'ten',
    11 => 'eleven',
    12 => 'twelve',
    13 => 'thirteen',
    14 => 'fourteen',
    15 => 'fifteen',
    16 => 'sixteen',
    17 => 'seventeen',
    18 => 'eighteen',
    19 => 'nineteen', 
    20 => 'twenty'
);

/*
 * 
 * returns an array representing components of a math captcha
 *  [0] - first variable value, as string, like either '4' or 'four'
 *  [1] - second value, the operator, like '+' or 'plus'
 *  [2] - third value, the second variable, like 'ten' or '10'
 *  [3] - the answer, in numerical form, like '14'
 *  [4] - the answer, in text form, like 'fourteen'
 */
function getMathCaptcha(){

    global $wordNumbers;

    $equation = array();

    // get first number, between 7 and 13 inclusive
    $n1 = rand(7, 13);
    $r = rand(0,1);
    // return $n1 as digit or text
    if ($r == 0) {
        $equation[0] = $n1;
    } else {
        $equation[0] = $wordNumbers[$n1];
    }

    // get operator
    $o = rand(0,1);
    $r = rand(0,1);
    if ($o == 0){
        // subtraction
        if ($r == 0) {
            $equation[1] = '-';
        } else {
            $equation[1] = 'minus';
        }
    } else {
        // addition
        if ($r == 0) {
            $equation[1] = '+';
        } else {
            $equation[1] = 'plus';
        }
    }

    // get second number, between 0 and 7 inclusive, so no negative answers
    $n2 = rand(1,7);
    $r = rand(0,1);
    // return $n2 as digit or text
    if ($r == 0) {
        $equation[2] = $n2;
    } else {
        $equation[2] = $wordNumbers[$n2];
    }

    // get answer
    if ($o == 0){
        $answer = $n1 - $n2;
    } else {
        $answer = $n1 + $n2;
    }

    // answer as digit and text
    $equation[3] = $answer;
    $equation[4] = $wordNumbers[$answer];


    return $equation;

}


?>
于 2012-12-20T18:15:47.437 回答
1

你试过像我下面这样的验证码方法吗?

这种验证码方法的缺点是什么

还是您特别想使用用户输入方法?

于 2012-04-18T10:49:09.527 回答
0

使用Captchator怎么样?

它很容易实现,而且很有效!那里还有 PHP 和 Ruby 的代码示例,用其他语言实现应该不难。

基于数学的验证码很弱且容易通过,有很多垃圾邮件机器人知道如何做数学:)

于 2012-04-18T09:38:13.010 回答
0

如果我要制作一个简单的,它将遵循以下原则:

制作不同类别的物品,如鲜花、水果、蔬菜和肉类。然后设计验证码以询问总共一个类别。

例如:

随机化类别,选择 2 个独特的类别。所以也许我们得到了鲜花和水果。接下来,问用户:“如果你有 3 朵玫瑰、4 个橙子和 6 个苹果,那么你有多少水果?”

简单模式:

获取 n-1 个唯一类别。显示 n 个项目,其中每个项目属于唯一类别之一。要求一个类别的总数。

于 2012-04-18T09:48:11.823 回答
0

您可以自己创建这样的验证码。您所要做的就是创建一个函数,该函数将在给定的数字列表之间选取一个随机数,然后调用该函数两次以获取两个随机数。

将结果存储在会话变量或任何其他变量中,以便您以后可以验证它。

下面是一个用 c# 编码的示例

    Random a=new Random();
    a.Next();//it will return you a non negative number
    a.Next(min value,maximum value);//it will return you a number between the range specified.

希望这可以帮助

于 2012-04-18T09:54:41.587 回答