PHP 简单的数学验证码函数
PHP simple math captcha function
我正在尝试编写一个简单的数学验证码函数来验证允许用户post 博客上的特定文章的表单。
函数:
function create_captcha($num1, $num2) {
$num1 = (int)$num1;
$num2 = (int)$num2;
$rand_num_1 = mt_rand($num1, $num2);
$rand_num_2 = mt_rand($num1, $num2);
$result = $rand_num_1 + $rand_num_2;
return $result;
}
表格:
<h2 class="email_users_headers">Post Article</h1>
<form action="" method="post" id="post_blog_entry">
<input type="text" name="title" id="title" placeholder="title... *"><br>
<textarea name="content" id="content" cols="30" rows="5" placeholder="content... *"></textarea><br>
<?php echo create_captcha(1, 20) . ' + ' . create_captcha(1, 20) . ' = '; ?>
<input type="text" name="captcha_results" size="2">
<input type="hidden" name='num1' value='<?php echo create_captcha(1, 20); ?>'>
<input type="hidden" name='num2' value='<?php echo create_captcha(1, 20); ?>'>
<input type="submit" name="publish" value="post entry" id="publish">
</form>
验证码验证:
if (empty($_POST['captcha_results']) === true) {
$errors[] = 'Please enter captcha';
} else {
if ($_POST['captcha_results'] != $_POST['num1'] + $_POST['num2']) {
$errors[] = 'Incorrect captcha';
}
}
我知道这是完全错误的,因为无论输入什么,结果总是不正确的。有人能给我指明正确的方向吗,因为我对 PHP 没有任何经验。
每次你 运行 create_captcha(1, 20)
它都会产生不同的值。
- create_captcha(1, 20) - 3 + 7 = 10
- create_captcha(1, 20) - 6 + 11 = 17
...
在您的表单中,您调用它 4 次。
我认为你应该这样做:
$num1 = create_captcha(1, 20);
$num2 = create_captcha(1, 20);
并在您的表单中使用此值:
<textarea name="content" id="content" cols="30" rows="5" placeholder="content... *"></textarea><br>
<?php echo $num1 . ' + ' . $num2 . ' = '; ?>
<input type="text" name="captcha_results" size="2">
<input type="hidden" name='num1' value='<?php echo $num1; ?>'>
<input type="hidden" name='num2' value='<?php echo $num2; ?>'>
隐藏输入中的两个数字允许机器人通过 javascript 解决它(参见伪代码)
code = hidden[0].value + hidden[1].value
为了缓解这种情况,请考虑乘以该值并使用 base64。这会减慢机器人的速度。
您可以通过提供诱饵隐藏输入来进一步缓解它
$num3 = mt_rand(0,20);
echo '<input type="hidden" name="num3" value="'.$num3.'">';
不过我很喜欢这个主意。
我正在尝试编写一个简单的数学验证码函数来验证允许用户post 博客上的特定文章的表单。
函数:
function create_captcha($num1, $num2) {
$num1 = (int)$num1;
$num2 = (int)$num2;
$rand_num_1 = mt_rand($num1, $num2);
$rand_num_2 = mt_rand($num1, $num2);
$result = $rand_num_1 + $rand_num_2;
return $result;
}
表格:
<h2 class="email_users_headers">Post Article</h1>
<form action="" method="post" id="post_blog_entry">
<input type="text" name="title" id="title" placeholder="title... *"><br>
<textarea name="content" id="content" cols="30" rows="5" placeholder="content... *"></textarea><br>
<?php echo create_captcha(1, 20) . ' + ' . create_captcha(1, 20) . ' = '; ?>
<input type="text" name="captcha_results" size="2">
<input type="hidden" name='num1' value='<?php echo create_captcha(1, 20); ?>'>
<input type="hidden" name='num2' value='<?php echo create_captcha(1, 20); ?>'>
<input type="submit" name="publish" value="post entry" id="publish">
</form>
验证码验证:
if (empty($_POST['captcha_results']) === true) {
$errors[] = 'Please enter captcha';
} else {
if ($_POST['captcha_results'] != $_POST['num1'] + $_POST['num2']) {
$errors[] = 'Incorrect captcha';
}
}
我知道这是完全错误的,因为无论输入什么,结果总是不正确的。有人能给我指明正确的方向吗,因为我对 PHP 没有任何经验。
每次你 运行 create_captcha(1, 20)
它都会产生不同的值。
- create_captcha(1, 20) - 3 + 7 = 10
- create_captcha(1, 20) - 6 + 11 = 17 ...
在您的表单中,您调用它 4 次。
我认为你应该这样做:
$num1 = create_captcha(1, 20);
$num2 = create_captcha(1, 20);
并在您的表单中使用此值:
<textarea name="content" id="content" cols="30" rows="5" placeholder="content... *"></textarea><br>
<?php echo $num1 . ' + ' . $num2 . ' = '; ?>
<input type="text" name="captcha_results" size="2">
<input type="hidden" name='num1' value='<?php echo $num1; ?>'>
<input type="hidden" name='num2' value='<?php echo $num2; ?>'>
隐藏输入中的两个数字允许机器人通过 javascript 解决它(参见伪代码)
code = hidden[0].value + hidden[1].value
为了缓解这种情况,请考虑乘以该值并使用 base64。这会减慢机器人的速度。
您可以通过提供诱饵隐藏输入来进一步缓解它
$num3 = mt_rand(0,20);
echo '<input type="hidden" name="num3" value="'.$num3.'">';
不过我很喜欢这个主意。