2011-04-09 95 views
2

我想实现一个验证码系统,并且我发现了一个很好很简单的类低槽谷歌,做我想要的。PHP:将一个类实例传递给另一个页面?

它是这样的:

$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都不见了......

我如何通过这些变量后,表单被提交到下一页?

+1

你需要显示一个链接到所述验证码类。 - 但是尝试实例化一个新的。 - >检查方法可能独立工作。 (否则你必须将原始对象序列化到$ _SESSION中。) – mario 2011-04-09 02:42:10

+0

@mario:你说得对:D它只是我需要作为隐藏输入字段传递的$前缀:) – Alex 2011-04-09 02:52:45

回答

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); 
?> 

事实上,我认为这个类是仅具有静态方法更好,但这是我的看法。无论如何,这意味着所有的数据只能存储在服务器端,所以他们不能只查看源代码的captcha答案。

+0

但$前缀不是验证码。我认为这是它的ID或者什么,因为我看到了一个由这个ID生成的php和图像文件名。该php文件在其中包含一个变量中的验证码。 – Alex 2011-04-09 03:22:29

+0

这比将验证码添加到源代码中要好一些,但仍然很脆弱,因为垃圾邮件发送者可能只需下载该库并复制/粘贴算法,以便在其bot中从'$ prefix'生成验证码答案,然后让该bot用该算法的返回值进行响应。 – ShotgunToothpaste 2011-04-09 03:25:30

+0

是的,但我只需要一些非常简单的东西:) – Alex 2011-04-09 03:38:31

1

您可能需要将其设置在会话,然后当它的发布,你需要在会​​话与值检查

希望这有助于

1

你想马歇尔该实例并将其保存在一个会话,因为HTTP是无状态的。然后您可以在第二页上对它进行解码。

然而

大多数PHP captcha系统我见过不需要此功能,而该检查功能应独立工作,通常是将数据从一个存储会话和POST变量进行比较。

相关问题