我正在尝试在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
}
答案 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中。
祝你好运!