【问题标题】:Home made captcha , is it safe?自制验证码,安全吗?
【发布时间】:2012-10-31 21:39:26
【问题描述】:

我一直在收集有关如何防止登录页面上的暴力攻击或防止创建多个帐户的骚扰的信息。

我得出结论(感谢 Stackoverflow 的你们),最好的方法是使用验证码。

但难以阅读的验证码或重音字符可能会阻止用户使用网站。

所以,我发现了一个易于使用的小脚本,适合我的网站。这是一个简单的数学验证码,建议将 0 到 10 的 2 个数字相加。它显示单词 'one' 'two' 'three' ...而不是数字。

我的问题是:

1) 这个小验证码本身是否提供足够的安全性?

2) 我集成它的方式安全吗? (有什么办法绕过它?)

为了避免粘贴800行代码我做了一个总结,希望清楚。

验证码脚本:

$n1  = mt_rand(0,10);  
$n2  = mt_rand(0,10);  
$fig = array('zero','one','two','three','four','five','six','seven','eight','nine','ten');  
$result = $n1 + $n2;
$sentence = $fig[$n1] .' plus '.$fig[$n2];  
$_SESSION['captcha'] = $result;  
$captcha_label = "<label for='captcha' >How much does ".$sentence."make?</label>";               
echo $captcha_label."</label><input  type='text' name='captcha'  value=''/><br />";                                 
echo "<input type='submit' name='create' value='create account'>"; 

页数:

  • form.php:

所有'创建帐户'输入字段+验证码

=> 测试

  • test.php:

    if($_POST['captcha'] != $_SESSION['captcha']){
    $_SESSION['captcha_control'] = "false";
    }

然后所有'创建帐户' $_POSTS 都经过注入测试

如果其中任何一个或验证码返回 "false" ,脚本将转向 => question.php

  • 问题.php:

与所有“错误字段”突出显示的初始表单相呼应 并显示一个新的验证码,是对还是错。
验证 => 返回 test.php

非常感谢。

【问题讨论】:

  • 值得花时间和精力去做这件事吗?
  • 重新发明轮子总是一个坏主意。
  • 验证码应该很容易被人类解决,但计算机却不是那么容易解决。您的验证码会阻止大多数垃圾邮件发送者,因为它是一种自制的解决方案,但如果有人愿意,他们可以在一个小时左右的时间内破解它。我会坚持使用 reCAPTHCA。
  • @duskwuff 任何在后端使用人工的垃圾邮件系统都会使验证码系统失效。

标签: php security captcha brute-force


【解决方案1】:

与大多数简单的验证码一样,它会运行得相当好,直到您的网站足够重要,让垃圾邮件发送者花几分钟时间弄清楚如何破解它。到那时,您将被垃圾邮件淹没。

如果您打算使用自己的 CAPTCHA,那就大材小用了——它甚至不需要是随机的。简单地要求用户输入一个常量词(例如,“在此框中输入‘橙色’”)将阻止绝大多数简单的垃圾邮件程序。

【讨论】:

  • 但是,如果自定义垃圾邮件机器人来突破您的系统,则只需几秒钟即可对其进行编程以完成如此​​简单的验证码。问题中的加法需要稍长一些,但对于任何有经验的程序员来说仍然不会少于几分钟。
  • 如果你是一个足够有价值的目标,无论如何它都可能被破坏或暴力破解。如果您使用的 CAPTCHA 在通用软件中找到,也是如此。垃圾邮件发送者毁了一切。 :(
  • 谢谢。那么回到 Recaptcha 呢?
  • 不,正如我提到的,那更糟。由于经常遇到 reCaptcha,许多常用的垃圾邮件软件会识别它并自动将其传递给人类求解器。实际上,您最好从自己的自定义验证码开始。
  • 我真的不知道为什么有人会在这条路上跑。输入上述问题所需的时间比与 reCAPTCHA 集成所需的时间要长。
【解决方案2】:

我认为duskwuff 回答了您关于验证码质量的问题。至于问题标题中问的是否“安全”,您尚未定义该术语,但可能没有。

$_SESSION['captcha'] = $result;

可能会在您确定是否与合法用户打交道之前分配一个服务器端会话。这会使您面临 DOS 攻击,因为攻击者只需要在会话超时窗口内创建大量唯一会话即可占用您服务器上的存储空间。由于您依赖于默默无闻,将答案存储在隐藏变量中(并将所有输入放在 &lt;form&gt; 标记中)也不会占用服务器端资源。

【讨论】:

  • +1 感谢您的洞察力。那么唯一的解决方案是 Recaptcha 呢?
  • @SunnyOne,如果您担心用户被吓倒,那么我认为像 Recaptcha 这样的系统在处理视障用户、非英语使用者等方面做了很多工作比一次性更容易获得。避免阻止用户的最佳方法是在用户注册墙之外提供引人注目的内容。顺便说一句,验证码不会阻止“创建多个帐户”,只是将其降低到低水平。愿意支付第三世界国家低工资工人的人仍然可以雇用人员来创建帐户。
  • 也许忘了说:我的网站不是论坛式的,应该是一个房地产代理机构......有一天。所以注册是为了插入广告。这很重要吗?谢谢大家的回答,我还是有点疑惑。这么多不同的意见。
  • @SunnyOne,当然,但您已经依赖机器人作者而不是根据您的验证码自定义他们的机器人。
  • @SunnyOne,没有。这也只会占用服务器上的线程。
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多