验证码验证逻辑?

时间:2010-02-08 00:03:57

标签: language-agnostic captcha

我需要为我正在处理的集成软件编写验证码服务。经过一番思考后,我想我并不完全理解验证码在技术上是如何工作的(我确实理解它在功能上是如何工作的),因此无法做出一些设计决策。困扰我的一些事情是:

  1. 我应该为每个用户保留一个会话吗? (即记住他们的IP,域名等)
  2. 我应该在失败时重新生成密码吗? (我知道google和digg这样的网站会这样做)
  3. 每次通话都会打到数据库我不确定这是否会影响服务器的性能,但我会考虑使用像memcahed这样的东西。但是我无法想到没有命中db或cache因为你需要先读取,然后验证然后更新。
  4. 我是否需要验证码的到期时间?说15分钟?
  5. 如果1为是,那么我认为逻辑变得复杂,因为我需要做以下事情: 这个密码短语之前已经过验证吗?它过期了吗?是来自同一个IP吗?等

    如果我需要记住IP并进行验证,经过太多无效请求后我该怎么办?我阻止它们吗?

    所以我认为验证码应该以这种方式工作,简单方法:

    无状态的排序,这意味着生成的每个验证码只能存活2个请求,即初始请求和子序列请求。结果将失败或通过。如果失败则创建一个新的。

    我认为可以提出一些建议或解释适当的验证码如何工作的人。感谢。

    更新

    我需要解释一下功能要求:

    条款:

    • 客户是www
    • 中的其他人
    • 我的服务包括:验证码服务和客户可以通过http请求访问的其他服务。

    工作流:

    1. 客户向验证码服务提出请求
    2. captcha服务生成令牌,密码并保存到db
    3. 客户向验证码网站发送http请求以检索图片
    4. 客户向我们的其他服务提出请求并传递密码
    5. 我们的其他服务将使用密码来验证我们的验证码服务 等...
    6. 我也在想是否有必要3。或者我应该在第2步中租用图像流。

3 个答案:

答案 0 :(得分:1)

  

1:我应该为每个用户保留一个会话吗? (即记住他们的IP,域名等)

取决于您正在使用的服务器端Web编程语言。大多数人只提供管理会话的内置方法,例如PHP使用session_start()和访问$_SESSION,例如JSP / Servlet,你可以通过HttpServletRequest#getSession()获得它。由于你没有提到你正在使用哪一个,我无法给出更具体/详细的答案。我所能建议的只是查阅相关编程语言的文档/图书/书籍。

您无需记住IP。只需在会话中设置一个键/令牌就足够了 - 这反过来通常已经被一个cookie支持了,所以如果你打算在家里生成这个,你理论上也可以只使用一个cookie(注意:不要把回答cookie,但只是一些识别客户端的唯一键!)。

  

2:我应该在失败时重新生成密码吗? (我知道像google和digg这样的网站可以做到这一点)

当然你应该。否则机器人很容易在验证码上做暴力。

那就是说,你有没有理由不使用你可以插入的现有验证码API,例如reCAPTCHA

答案 1 :(得分:0)

Captchas很难。在设计它们以及打破它们方面有很多研究。 一个更好,更有用的解决方案是使用像reCAPTCHA这样的工具:http://recaptcha.net/whyrecaptcha.html,它提供了相当好的安全性,使集成变得容易,并使打字时间变得有用。

答案 2 :(得分:0)

我应该从为什么要使用captcha开始?由于明显的答案是防止垃圾邮件机器人,我认为每个用户保存会话是一个坏主意。它可能导致错误地阻止合法用户。此外,它不会阻止智能机器人继续尝试打破您的验证码。

此外,如果你不会重新生成验证码,一个好的机器人最终会破坏它

所以,恕我直言,你最好永远不会阻止用户,(可能阻止注册用户,但如果它是匿名的,那么没有)并为每个请求重新生成验证码。