PHP中的简单验证码与rand()

时间:2013-12-02 16:15:46

标签: php mysql sql

我正在尝试在PHP中创建一个简单的验证码,但它不起作用。查询当前未执行。这是我目前的代码:

<?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
}

4 个答案:

答案 0 :(得分:2)

因为$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.

编辑: As suggested by @nl-x您应该使用会话变量而不是隐藏字段来防止滥用验证码:

<?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) {
    // ...

答案 1 :(得分:2)

当您使用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
}
?>

答案 2 :(得分:1)

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

<input type="text" name="r_input"/><br />

<?php   // <----this is missing

$Cap = mysql_real_escape_string($_POST['r_input']);

答案 3 :(得分:-1)

请原谅我,但你没有真正的验证码。验证码的目的是区分人体和机器人。我强烈建议你选择一个图像数据库,并随机化一个函数来调用图像。在内部,我会检查图像的文本/描述是否与用户键入的内容相匹配。

您唯一需要rand()的是从图像数据库加载的图像。

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

我不是PHP的专业人士,甚至不是编程人员,但我认为你会走向错误的一方 - 你的代码不会阻止任何......恶意行为或任何行动您将尝试使用验证码进行预防。

在谷歌搜索图书馆。 PhpCaptcha is one of them. here是一个非常简单的phpcaptcha快速入门指南。

这是一个代码示例,摘自我上面链接的PHPCaptch。

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

<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对象,负责创建,管理和验证验证码。

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

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以最小的努力工作。 此代码也包含在here中。

祝你好运!