我正在尝试将一个简单的验证码应用到我正在构建的表单中,但我遇到了一个我自己似乎无法解决的问题。
我正在使用简单的代码生成一个像这样的随机数....
$randomnr = rand(1000, 9999);
$_SESSION['randomnr2'] = md5($randomnr);
....然后再生成一些代码来生成随机数的图像并将其显示在页面上。我这样反对它的有效性......
if (strlen($captcha) !== ($_SESSION['randomnr2'])) {
$error['captcha'] = "CAPTCHA error. Please try again";
}
如何根据存储在会话randomnr2
中的随机数检查已输入到验证码输入字段的值?
答案 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]。是的,更简单的图像验证码与设置的字体,间距和大小可以被一种像素模式字典攻击破解。