PHP中使用rand()的简单Captcha


Simple Captcha in PHP with rand()

我试图用PHP制作一个简单的captcha,但它不起作用。查询当前未执行。这是我当前的代码:

<?php
   $Random = rand(1, 100);
   $Random2 = rand(1,100);
   echo "Result: ".$Random." + ".$Random2." ?";
?>
<input type="text" name="r_input"/><br />
$Cap = mysql_real_escape_string($_POST['r_input']);
$Result = $Random+$Random2;
if(isset($_POST['myButton']) and trim($Var) and trim($Var2) and trim($Var3) and $Cap==$Result){
   //My Query
}

当您使用rand()生成2个值,并显示这2个值时,并为用户提供输入答案的表单。。。

用户输入答案并提交回服务器。。。

服务器得到答案,然后生成2个与用户给出的答案不对应的新值。

尝试使用会话变量将生成的值存储在中,并在用户提交表单时与之匹配!

<?php
session_start();
$captcha_id = 'captcha_' . rand();
$_SESSION['$captcha_id']['val1'] = rand(1,1000);
$_SESSION['$captcha_id']['val2'] = rand(1,1000);
echo "
    <form action='' method='post'>
        <p>Result: {$_SESSION['$captcha_id']['val1']} + {$_SESSION['$captcha_id']['val2']} = </p>
        <input type='hidden' name='captcha_id' value='{$captcha_id}' />
        <input type='text' name='captcha_answer' />
        <p>?</p>
    </form>
";
if (
    isset($_POST['captcha_id'])
    && isset($_SESSION[$_POST['captcha_id']])
    && isset($_POST['captcha_answer'])
    && $_SESSION[$_POST['captcha_id']]['val1'] + $_SESSION[$_POST['captcha_id']]['val2'] == intval($_POST['captcha_answer'])
) {
    unset($_SESSION[$_POST['captcha_id']]); // don't let this answer be reused anymore.
    // do allowed stuff
}
?>

因为$Random$Random2每次都有不同的值。

当您第一次显示表单时,它们的值可能为$Random = 12$Random2 = 26。用户看到这些,将它们正确相加,然后键入38(这是这两个值的正确答案)。答案再次发送到脚本,$Random$Random2的值再次生成(这次是$Random = 23$Random2 = 30,等于53),并且用户发送的答案不再正确。

因此,您需要将这些值存储在隐藏字段中,并将其相加,而不是生成的值,例如:

<input type="hidden" name="rand_1" value="<?php echo $Random; ?>">
<input type="hidden" name="rand_2" value="<?php echo $Random2; ?>">
<?php
    if ($_POST['rand_1'] + $_POST['rand_2'] == $_POST['r_input']) {
    // Query etc.

编辑:根据@nl-x的建议,您应该使用会话变量而不是隐藏字段,以防止滥用captcha:

<?php
    $Random = $_SESSION['rand_1'] = rand(1, 100);
    $Random2 = $_SESSION['rand_2'] = rand(1,100);
    echo "Result: ".$Random." + ".$Random2." ?";
?>

然后根据给定的结果检查这些值:

<?php
    $Cap = mysql_real_escape_string($_POST['r_input']);
    $Result = $_SESSION['rand_1'] + $_SESSION['rand_2'];
    if ($Result == $Cap) {
    // ...

输出表单字段后,您永远不会重新进入PHP模式:

<input type="text" name="r_input"/><br />
<?php   // <----this is missing
$Cap = mysql_real_escape_string($_POST['r_input']);

对不起,你不是在做一个真正的captcha。captcha的目的是区分人类和机器人。我强烈建议您选择一个图像数据库,并随机化一个函数来调用图像。在内部,我会检查图像的文本/描述是否与用户键入的内容匹配。

唯一要rand()的是从图像数据库中加载什么图像。

这是一种不健康的方法,而且有很多更好的方法可以做到这一点。但它更接近于一个captcha,而不仅仅是你当前的代码。还有很多库和引擎可以为您完成这项工作。

我不是PHP专家,甚至不是编程专家,但我认为你走错了路——你的代码不会阻止任何。。。恶意行为,或者你试图用captcha阻止的任何类型的行为。

在谷歌上搜索图书馆。PhpCaptcha就是其中之一。这里有一个非常简单的phpcaptcha快速启动指南。

下面是一个代码示例,从我上面链接的PHPCaptch中提取。

在表单中所需的位置,添加以下代码以显示CAPTCHA图像:

<img id="captcha" src="/securimage/securimage_show.php" alt="CAPTCHA Image" />

接下来,添加以下HTML代码来创建一个文本输入框:

<input type="text" name="captcha_code" size="10" maxlength="6" />
<a href="#" onclick="document.getElementById('captcha').src = '/securimage/securimage_show.php?' + Math.random(); return false">[ Different Image ]</a>

在表单处理器的第一行,添加以下代码:

<?php session_start(); ?>

以下php代码应该集成到处理表单的脚本中,并且应该放在进行错误检查的地方。建议将其放置在任何错误检查之后,并且只有在没有发生其他表单错误的情况下才尝试验证captha代码它也应该在标记中。

include_once $_SERVER['DOCUMENT_ROOT'] . '/securimage/securimage.php';
$securimage = new Securimage();

这包括包含Securimage源代码的文件,并创建一个新的Securimage对象,负责创建、管理和验证captcha代码。

接下来,我们将检查用户输入的代码是否正确。

if ($securimage->check($_POST['captcha_code']) == false) {
  // the code was incorrect
  // you should handle the error so that the form processor doesn't continue
  // or you can use the following code if there is no validation or you do not know how
  echo "The security code entered was incorrect.<br /><br />";
  echo "Please go <a href='javascript:history.go(-1)'>back</a> and try again.";
  exit;
}

按照上面的指示应该可以让Securimage以最小的努力工作。此代码也包含在此处。

祝你好运!