我需要为我正在开发的集成软件编写验证码服务。经过一番思考,我想我并没有完全理解验证码在技术上是如何工作的(我确实了解它在功能上是如何工作的),因此无法做出一些设计决策。困扰我的几件事是:
如果 1 是肯定的,那么我认为逻辑变得复杂,因为我需要做这样的事情:
这个密码之前是否经过验证?过期了吗?是同一个ip吗?等等
如果我需要记住 IP 并对其进行验证,在太多无效请求之后我该怎么办?我阻止他们吗?
所以我认为验证码应该这样工作,简单的方法:
有点无状态,这意味着生成的每个验证码只能在 2 个请求中存活,初始请求和子序列请求。结果要么失败,要么通过。如果失败,则创建一个新的。
我很感激可以提出一些建议或解释正确验证码如何工作的人。谢谢。
更新:
我需要解释一下功能需求:
条款:
工作流程:
等等...
我也在考虑是否需要 3。或者我应该在步骤 2 中租用图像流。
最佳答案
1: Should I keep a session for each user? (i.e. remember their IP, domain, etc)
取决于您使用的服务器端 Web 编程语言。大多数他们只提供内置的方式来管理 session ,例如 PHP 使用
session_start()
和访问 $_SESSION
例如在 JSP/Servlet 中,您可以通过 HttpServletRequest#getSession()
获得它.由于您没有提到您使用的是哪一个,我无法给出更具体/详细的答案。我所能建议的只是查阅相关编程语言的文档/tuts/书籍。您无需记住 IP。只需在 session 中设置一个 key / token 就足够了——这通常已经由 cookie 支持,因此如果您打算自行开发这一切,理论上您也可以只使用 cookie(注意:不要把cookie 中的答案,但只是一些唯一的 key 来识别客户端!)。
2: Should I regenerate a passphrase on fail? (I know that sites like google and digg do it)
你当然应该。否则,机器人很容易对验证码进行暴力破解。
也就是说,您是否有任何理由不使用可以插入的现有验证码 API,例如 reCAPTCHA ?
关于language-agnostic - 验证码验证逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218913/