自制验证码,安全吗?

时间:2012-10-31 21:39:27

标签: php security captcha brute-force

我一直在收集有关如何防止日志页面上的强力攻击多个帐户创建的骚扰

的信息。

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

但是不方便阅读验证码或重音字符可能会阻止用户使用网站。

所以,我发现了一个易于使用的小脚本,我适应了我的网站。这是一个简单的数学验证码,建议总结从 0到10 的2个数字。它显示的单词'一个''两个''三个' ...而不是数字。

我的问题是:

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的:

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

=&GT;测试

  • test.php的:

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

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

如果其中任何一个或验证码返回“false”,则脚本会偏转到=&gt; problem.php

  • problem.php:

回显初始表单,突出显示所有“错误字段” 并显示一个新的验证码,是对还是错了。
validation =&gt;回到 test.php

非常感谢。

2 个答案:

答案 0 :(得分:7)

与大多数简单的CAPTCHA一样,它会合理地运行,直到您的网站足够重要,垃圾邮件发送者花费几分钟来确定如何打破它。此时,您将被垃圾邮件淹没。

如果您打算使用自己的CAPTCHA,这是过度的 - 它甚至不需要是随机的。简单地要求用户输入一个恒定的单词(例如,“在这个框中输入'橙色'”)将停止绝大多数简单的垃圾邮件。

答案 1 :(得分:3)

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

$_SESSION['captcha'] = $result;
在您确定是否正在与合法用户打交道之前,

可能会分配服务器端会话。由于攻击者只需要在会话超时窗口内创建大量唯一会话以占用服务器上的存储空间,因此可以打开DOS攻击。由于您依赖于隐匿性,将答案存储在隐藏变量中(并将所有输入放在<form>标记内)也可以在不占用服务器端资源的情况下完成。