【问题标题】:What is preventing people from using someone else's CAPTCHA as their own?是什么阻止人们使用别人的验证码作为自己的验证码?
【发布时间】:2013-07-06 06:19:57
【问题描述】:

为什么(除了道德原因)没有更多的人使用其他网站的验证码作为他们自己的验证码,同时出售所述验证码的解决方案?

对我来说,这样的系统似乎很容易实现:

  • 设置一个脚本,在另一个网站上执行某些操作,需要通过使用代理服务完成验证码
  • 当您网站上的用户执行需要完成验证码的任务时,只需向他们提供其他人的验证码即可 网站请您解决
  • 当用户解决验证码时,您的脚本可以在作为验证码来源的其他站点上执行所需的操作, 并且您网站上的用户也通过此过程进行了验证

这是家常便饭吗?如果不是,为什么不呢?如果有的话,可以做些什么来防止这种情况发生?

【问题讨论】:

  • 我不知道,但如果你是合法的验证码用户,那么这样做就像是在踢自己的脚。

标签: captcha


【解决方案1】:

获取验证码。假设人们可以轻松地从外国主机获取验证码的确切视觉效果。为此,您必须通过推荐检查(大多数浏览器(由人工导航)允许发送 http_referer)。您还必须从hidden input 中保存session_idsecret检查结果。 外部主机必须将保存的变量与与您的第一个请求的会话关联的变量链接起来,这需要您实现棘手的cURL 方法。您将不得不处理多个并行请求,所有这些请求都来自您的单个 IP。

与自己生成验证码相比,在外部主机上破解验证码时,您的服务器可能会使用更多资源。

预防

  1. http_referer 检查
  2. 将单个 IP 的请求限制为例如5/分钟
  3. 良好的会话处理和棘手的 cookie
  4. 对 javascript 进行逆向工程并非不可能,但是您的 javascript 越复杂,...
  5. 您必须找到一种能够识别外部主机上的结果的模式。最简单的签名可能是Location 标头字段,导致/path/success.html/path/tryagain.php

挑战:

我花了一点时间准备了一个例子:http://woisteinebank.de/test/

在此示例中,我将密钥附加到 session_id(); 并将其保存在数据库中。 通过session_regenerate_id();,我对每个请求都有一个新的会话。 在check.php 中,我将数据库值与$_GET 值进行比较。

试着想办法得到这个验证码,我会尽力防守。每次您成功在您的网站上使用我的验证码时,我都会尝试为它辩护。

【讨论】:

  • 是什么阻止了屏幕截图?
  • 给我几分钟时间演示一下
  • 感谢 Dan 提供的示例,但我不明白这如何阻止我所说的内容。会话不会改变,除非我在这里遗漏了一些东西(如果我错过了,请道歉)
  • 我看到你的更新丹。虽然我认为您有一些有趣的想法,但我相信您误解了我所说的“为网站上的用户提供图像”的意思。我的意思是脚本/程序(可以使用诸如 Tor 之类的代理服务)会复制图像,然后将其提供给用户来解决。一旦信息得到解决,解决方案就会由相同的脚本输入。在这种情况下,会话 ID 完全无关紧要,因为它们与解决 CAPTCHA 无关。虽然它可能更耗费资源,但解决验证码可能是有利可图的,例如:垃圾邮件
  • 很遗憾我最近有点忙,但有时间我会尝试在 Github 上放一些例子
猜你喜欢
  • 2010-10-26
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多