PHP - Captcha替换

时间:2010-12-17 12:04:50

标签: php security forms captcha

我需要您对此代码的意见,以实施反垃圾邮件解决方案:

  • 当生成页面/表单时,创建随机字符串,例如。像$string = md5($_SERVER['REMOTE_ADDR'])
  • 此字符串已插入数据库,并设置为在让我们说2小时后过期,因此我们不会填满数据库
  • 在页面加载时,表单有一个没有值的隐藏输入字段,我们将其命名为spam_check
  • 页面加载AJAX请求后10,15或20秒自动触发,尝试从db&amp ;;中检索$string。用它填写spam_check输入值。
  • 提交表单时,我们会在数据库$string$_POST['spam_check']之间执行简单检查,如果它们不匹配则邮件是垃圾邮件......

这是个好主意吗?它有多安全? 显而易见的优点是它不需要访问者采取任何行动,例如阅读验证码等。

3 个答案:

答案 0 :(得分:4)

由于$string不是非常随机,并且AJAX请求对于试图绕过保护的人来说是可见的,因此很容易构建一个自动检索$string的自动化,然后触发一个大量垃圾邮件到该表格上。

答案 1 :(得分:3)

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

看一下这篇文章已经广泛讨论的帖子 Practical non-image based CAPTCHA approaches?

无论如何,考虑到你的真实问题is this a good idea?,我无法想出它为什么不起作用的原因...我认为数据库部分是不必要的,但那里您可以在上一个链接中看到其他方式...

答案 2 :(得分:0)

有趣。我会谨慎地将其视为垃圾邮件/替代capcha的解决方案,但它确实使垃圾邮件制造者的生活变得更加困难。

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

  

$ string = md5($ _ SERVER ['REMOTE_ADDR'])

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

  

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

(尽管基础算法需要更多操作,但sha1略快于md5。)

使用会话可能是个好主意,并且:

  

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