我试图用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以最小的努力工作。此代码也包含在此处。
祝你好运!