3

我一直在收集有关如何保护日志页面免受暴力攻击或创建多个帐户的骚扰的信息。

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

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

所以,我发现了一个易于使用的小脚本,我适应了我的网站。这是一个简单的数学验证码,建议将 2 个数字从0 到 10相加。它显示单词“一”、“二”、“三” ……而不是数字。

我的问题是:

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'>"; 

页数:

  • 表格.php:

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

=> 测试

  • 测试.php:

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

然后所有'create account' $_POSTS 都经过注入测试

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

  • 问题.php:

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

非常感谢。

4

2 回答 2

7

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

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

于 2012-10-31T21:43:11.337 回答
4

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

$_SESSION['captcha'] = $result;

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

于 2012-10-31T21:50:39.480 回答