将用户输入的CAPTCHA值与会话中存储的预期值进行比较

时间:2011-04-13 21:20:03

标签: php forms captcha

我正在尝试将一个简单的验证码应用到我正在构建的表单中,但我遇到了一个我自己似乎无法解决的问题。

我正在使用简单的代码生成一个像这样的随机数....

$randomnr = rand(1000, 9999);
$_SESSION['randomnr2'] = md5($randomnr);

....然后再生成一些代码来生成随机数的图像并将其显示在页面上。我这样反对它的有效性......

if (strlen($captcha) !== ($_SESSION['randomnr2'])) { 
    $error['captcha'] = "CAPTCHA error. Please try again";
}

如何根据存储在会话randomnr2中的随机数检查已输入到验证码输入字段的值?

3 个答案:

答案 0 :(得分:1)

我不确定你为什么要在字符串的md5哈希中检查字符串的长度,但假设$captcha是用户的数字,你可以这样做:

if(md5($captcha) !== $_SESSION['randomnr2']) {
  $error['captcha'] = "CAPTCHA error. Please try again";
}

答案 1 :(得分:0)

PHP会自动将任何内容转换为strlen()的字符串(如果可以),所以

echo strlen(42); 
echo strlen('42');

将输出'2',即使第一个是整数。要将提交的值与商店值进行比较,就像

一样简单
if ($_SESSION['randomnr2'] === (int)$captcha) {
   ... it matched ...
}

您需要再次将提交的值转换为int,因为PHP $ _GET / POST数组中的任何内容都被内部视为字符串。

答案 2 :(得分:0)

<div id='captcha_to_show' style='border:1px solid silver;'>gobldeygook</div>
<input name='captcha' id='captcha'>

...

通过scriptmonkey附加...

$('document').ready(function(){
  $('#captcha').val($('#captcha_to_show').html());
});

查看开源验证码脚本。你的实现将需要在页面上发送验证码,以便通过拉动页面的任何内容可以看到它的值,并且那个人/机器人/任何可以相应填写验证字段的内容,所以你实际上没有保护。这就是为什么验证码要么使用难以用脚本阅读的复杂图像,要么使用人类在上下文中比机器人更好理解的语义问题,例如['你会说一个和三个的总和是什么?' === 4]。是的,更简单的图像验证码与设置的字体,间距和大小可以被一种像素模式字典攻击破解。