PHP:将类实例传递给另一个页面?

时间:2011-04-09 02:39:28

标签: php class forms post captcha

我正在尝试实现一个验证码系统,我找到了一个非常简单的类谷歌,它可以做我想要的。

它类似于:

$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已消失......

如何在表单提交到下一页后传递这些变量?

4 个答案:

答案 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_