我正在尝试实现一个验证码系统,我找到了一个非常简单的类谷歌,它可以做我想要的。
它类似于:
$captcha = new Captcha();
$prefix = mt_rand();
$image = $captcha->generate($prefix);
然后我在表格中添加图片:
<img src="<?php echo $image; ?>" />
<input name="captcha" type="text" value="Type the security code from above" />
到目前为止它工作正常,但我不知道如何检查提交的代码是否与验证码匹配。 在文档中,它说我必须这样做:
$correct = $captcha_instance->check($prefix, $_POST['captcha']);
但问题是提交表单后$captcha
而$prefix
已消失......
如何在表单提交到下一页后传递这些变量?
答案 0 :(得分:1)
您可能希望在会话中设置它,然后在发布时,您需要检查会话中的值
希望这有帮助
答案 1 :(得分:1)
您希望对该实例进行编组并将其保存在会话中,因为HTTP是无状态的。然后你可以在第二页上解组它。
<强>然而强>:
我见过的大多数PHP验证码系统都不需要这个功能,而是检查功能应该独立工作,通常比较存储会话和POST变量的数据。
答案 2 :(得分:1)
@mario:你是对的:D它只是 我需要传递的$前缀作为 隐藏输入字段:)
这是一个非常糟糕的主意 - 在您的表单标记中,如果您说隐藏字段captcha_answer
并且您将其值传递给$captchaInstance->check()
,那么您就会失去验证码的目的。 Captcha是从人类中挑选出机器人,但是通过在验证码解决机器人中下载源代码并将value="{answer}"
从源代码中取出来来读取值非常简单。
相反,你应该使用它:
<?php
session_start();
$_SESSION['answer'] = $prefix;
?>
然后在你的检查中你这样做:
<?php
session_start();
$prefix = $_SESSION['answer'];
$passed = $captcha->check($prefix);
?>
事实上,我认为这个类会更好,因为只有静态方法,但这是我的意见。无论如何,这种方式意味着所有数据都只存储在服务器端,所以他们不能只查看验证码答案的来源。
答案 3 :(得分:1)
IIS 7.x生成CAPTCHA映像所需的处理程序映射是什么?唯一有效的似乎是通配符,从安全角度来看这是荒谬的。根据{{3}} lockdownguide_wp_ue.pdf中的锁定指南,在加强ColdFusion的安全性时,他们建议删除此通配符映射,但这似乎会中断http://www.adobe.com/products/coldfusion/whitepapers/pdf/91025512_cf9_。