基于简单数学的验证码

时间:2012-04-18 09:31:34

标签: asp.net-mvc-3 validation captcha recaptcha

reCaptcha现在很难阅读(实际上是破译)。所以我正在寻找另一种可供使用的验证码系统。

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

是否有任何此类插件或关于如何构建自己的插件的想法?

(不复杂的数学like this one

5 个答案:

答案 0 :(得分:2)

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

组件的数组

[0] - 第一个变量值,如字符串,如“4”或“4” [1] - 第二个值,运算符,如'+'或'plus' [2] - 第三个值,第二个变量,如'ten'或'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;

}


?>

答案 1 :(得分:1)

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

what are the downpoints of this captcha method

或者您是否特别想要使用用户输入法?

答案 2 :(得分:0)

如何使用Captchator

它很容易实现,它只是工作!还有PHP和Ruby的代码示例,应该不难在其他语言中实现。

基于数学的验证码很弱且很容易通过,有很多垃圾邮件知道如何进行数学运算:)

答案 3 :(得分:0)

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

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

例如:

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

简单模式:

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

答案 4 :(得分: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.

希望这有帮助