我需要为我正在处理的集成软件编写验证码服务。经过一番思考后,我想我并不完全理解验证码在技术上是如何工作的(我确实理解它在功能上是如何工作的),因此无法做出一些设计决策。困扰我的一些事情是:
如果1为是,那么我认为逻辑变得复杂,因为我需要做以下事情: 这个密码短语之前已经过验证吗?它过期了吗?是来自同一个IP吗?等
如果我需要记住IP并进行验证,经过太多无效请求后我该怎么办?我阻止它们吗?
所以我认为验证码应该以这种方式工作,简单方法:
无状态的排序,这意味着生成的每个验证码只能存活2个请求,即初始请求和子序列请求。结果将失败或通过。如果失败则创建一个新的。
我认为可以提出一些建议或解释适当的验证码如何工作的人。感谢。
更新
我需要解释一下功能要求:
条款:
工作流:
我也在想是否有必要3。或者我应该在第2步中租用图像流。
答案 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开始?由于明显的答案是防止垃圾邮件机器人,我认为每个用户保存会话是一个坏主意。它可能导致错误地阻止合法用户。此外,它不会阻止智能机器人继续尝试打破您的验证码。
此外,如果你不会重新生成验证码,一个好的机器人最终会破坏它
所以,恕我直言,你最好永远不会阻止用户,(可能阻止注册用户,但如果它是匿名的,那么没有)并为每个请求重新生成验证码。