Language agnostic 验证码验证逻辑?

Language agnostic 验证码验证逻辑?,language-agnostic,captcha,Language Agnostic,Captcha,我需要为我正在开发的集成软件编写一个验证码服务。经过一番思考后,我认为我并不完全理解captcha在技术上是如何工作的(我确实理解它在功能上是如何工作的),因此无法做出一些设计决策。有几件事困扰着我: 我应该为每个用户保留一个会话吗?(即记住他们的IP、域等) 我应该在失败时重新生成密码短语吗?(我知道像谷歌和digg这样的网站会这么做) 每次调用都会碰到数据库,我不确定这是否会影响服务器上的性能,但我会考虑使用像MyCAHED之类的东西。但我想无论如何都不能不命中db或缓存,因为您需要先读取,

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

  • 我应该为每个用户保留一个会话吗?(即记住他们的IP、域等)
  • 我应该在失败时重新生成密码短语吗?(我知道像谷歌和digg这样的网站会这么做)
  • 每次调用都会碰到数据库,我不确定这是否会影响服务器上的性能,但我会考虑使用像MyCAHED之类的东西。但我想无论如何都不能不命中db或缓存,因为您需要先读取,然后验证,然后更新
  • 我需要验证码的有效期吗?15分钟
  • 如果1为“是”,则我认为逻辑变得复杂,因为我需要执行以下操作: 以前是否验证过此密码短语?过期了吗?它来自同一ip吗?等

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

    因此,我认为验证码应该以这种方式工作,简单的方式:

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

    我感谢能够提出一些建议或解释正确验证码工作原理的人。谢谢

    更新:

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

    术语:

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

  • 客户向验证码服务提出请求
  • 验证码服务生成令牌、密码短语并保存到数据库
  • 客户向验证码web发出http请求以检索图像
  • 客户向我们的其他服务提出请求并传入密码短语
  • 我们的其他服务将使用密码短语根据我们的验证码服务进行验证 等等
  • 我也在想,如果3是必要的。或者我应该在步骤2中重新打开图像流

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

    取决于您使用的服务器端web编程语言。大多数都只是提供了管理会话的内置方法,例如PHP使用
    session\u start()
    和access
    $\u session
    ,例如JSP/Servlet,您可以通过
    HttpServletRequest#getSession()
    获得它。由于您没有提到您使用的是哪一种,我无法给出更具体/详细的答案。我所能建议的只是查阅相关编程语言的文档/教程/书籍

    你不需要记住IP。只需在会话中设置一个密钥/令牌就足够了,而这通常已经得到了cookie的支持,因此,如果您打算将这一切都进行homegrow,理论上也可以使用cookie(注意:不要将答案放在cookie中,而只使用一些唯一的密钥来标识客户机!)

    2:我应该在失败时重新生成密码短语吗?(我知道像谷歌和digg这样的网站会这么做)

    你当然应该。否则,机器人很容易对验证码进行暴力攻击


    也就是说,是否有任何理由不使用现有的验证码API,您可以只插入其中,例如?

    验证码很难使用。在设计它们和打破它们方面有很多研究。
    一个更好、更有用的解决方案是使用像reCAPTCHA这样的工具:它提供了相当好的安全性,使集成变得容易,并使键入的时间变得有用。

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

    此外,如果您不重新生成CAPTCHA,一个好的机器人最终会破坏它


    因此,IMHO,最好不要阻止用户(可能会阻止注册用户,但如果是匿名用户,则不会),并为每个请求重新生成验证码。

    FYI,有验证码替代方案,如从列表中选择奇数项、解方程等。@Am,作为一个经常使用纯文本浏览器的用户(linux上的链接)我很欣赏非视觉验证码。@Ross这是一个网站,我不能决定是否使用它。但我确实理解。我更新了我的问题,这在某种程度上解释了为什么我不能使用recaptcha(问题的底部)。也许我可以,但我不知道如何修改recaptcha以满足我的需要。@BalusC:我也打算建议recaptcha,因为OP似乎对如何实现CAPTCHA感到困惑。。。但在重新阅读(编辑)的问题后,显然他想为他的客户自己提供一个类似于reCAPTCHA的服务:(@Wizardofods,从某种意义上说你是对的,但它更适合B2B和SOA,所以它不需要像reCAPTCHA那样复杂。顺便说一句,我一直在使用reCAPTCHA。但我不确定我是否能让reCAPTCHA按我的意愿去做(需要)。