2010-12-17 57 views
2

我需要你的意见对这个代码用于实现反垃圾邮件解决方案:PHP - 验证码更换

  • 当产生页/形式,一个随机字符串被创建,例如。像$string = md5($_SERVER['REMOTE_ADDR'])
  • 此字符串插入到数据库中,并设置为过期后,假设2小时,我们不填写数据库
  • 在网页加载时,窗体有一个隐藏的输入字段没有价值,让我们的名字它spam_check
  • 页面已加载AJAX请求后10,15或20秒自动启动,试图检索$string从db &填写spam_check输入值与它。
  • 提交表单的时候,我们执行$string从DB和$_POST['spam_check']之间进行简单的检查,如果它们不匹配的邮件是垃圾邮件...

这是一个好主意?它有多安全? 明显的优势是,它不需要访客的任何操作,如阅读验证码等。

+1

即使它是垃圾邮件,我也很困惑,因为垃圾邮件工具获取html代码并根据该代码发布帖子,所以该值将是正确的。我弄错你了吗? – Pabuc 2010-12-17 12:08:10

+0

好的想法是,垃圾邮件机器人不会做JavaScript,如果它提交表单,则不会等待10秒钟: – Alex 2010-12-17 12:09:13

+0

如果用户输入的速度非常快,但会出现问题 – robjmills 2010-12-17 12:36:29

回答

0

有趣。我会考虑将其视为垃圾邮件/替换垃圾邮件的解决方案,但这确实会使垃圾邮件发送者的生活变得更加困难。

但是,您应该计划处理javascript被禁用的情况(可能还有CSS) - 例如,通过为表单分配一个div,但留下一个默认消息,然后使用javascript(内联而不是等待onload/pageready)将表单写入它。

$字符串= MD5($ _ SERVER [ 'REMOTE_ADDR'])

这不是一个随机值 - 它也不会改变。考虑:

$ string = sha1($ _ SERVER ['REMOTE_ADDR']。rand(1000).time());

(虽然底层算法需要更多ops,但sha1稍快于md5)。

这可能是一个好主意,使用一个会话,并且:(SESSION_ID()兰特(1000)。时间())

$ _ SERVER [ '字符串'] = SHA1;

+0

谢谢。我对会话不太了解,我听说他们是邪恶的,所以我没有搜索更多的信息:)但我现在要做 – Alex 2010-12-17 16:09:55

4

由于$string不是非常随意的,并且AJAX请求对于试图规避您的保护的人可见,建立自动化很容易,事先检索$string,然后将大量垃圾邮件发送到该表单上。

3

我喜欢的一种方法是使用CSS来隐藏<input type="text">元素。机器人不知道它是否隐藏,普通用户永远不会看到它。

看看这个帖子里这个话题已经广泛讨论 Practical non-image based CAPTCHA approaches?

不管怎么说,考虑到你的真正的问题is this a good idea?,我想不出理由,为什么它不会工作...我认为数据库部分是没有必要的,但还有其他的方法,你可以在前面的链接看到...

+0

我使用这种“蜜罐”技术,我发现它非常有效 – robjmills 2010-12-17 12:37:27