Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 自制验证码,安全吗?_Php_Security_Captcha_Brute Force - Fatal编程技术网

Php 自制验证码,安全吗?

Php 自制验证码,安全吗?,php,security,captcha,brute-force,Php,Security,Captcha,Brute Force,我一直在收集有关如何在日志页面上防止暴力攻击或防止创建多个帐户的攻击的信息 我得出结论(多亏了Stackoverflow的你们),最好的方法就是使用CAPTCHA 但不易阅读验证码或重音字符可能会阻止用户使用网站 所以,我找到了一个适合我的网站的简单易用的小脚本。这是一个简单的数学验证码,建议将0到10的两位数相加。它显示单词“一”“二”“三”。。。不是数字 我的问题是: 1) 这个小小的验证码本身是否提供了足够的安全性 2) 我集成的方式安全吗?(有没有办法绕过它?) 为了避免粘贴800行代码

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

我得出结论(多亏了Stackoverflow的你们),最好的方法就是使用CAPTCHA

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

所以,我找到了一个适合我的网站的简单易用的小脚本。这是一个简单的数学验证码,建议将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'>"; 
$n1=百万兰特(0,10);
$n2=百万兰特(0,10);
$fig=数组('0','1','2','3','4','5','6','7','8','9','10');
$result=$n1+$n2;
$SENTURE=$fig[$n1]。'plus'。$fig[$n2];
$\会话['captcha]=$result;
$captcha_label=“多少钱”$句子。“制造?”;
echo$captcha_标签“
”; 回声“;
页面:

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

    $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'>"; 
    
    if($\u POST['captcha]!=$\u SESSION['captcha]]){
    $\会话['captcha\U控制']=“假”;
    }

然后对所有“创建帐户”$\u帖子进行注入测试

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

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


非常感谢。

像大多数简单的验证码一样,它会工作得相当好,直到你的网站足够重要,让垃圾邮件发送者花上几分钟来找出如何破解它。在这一点上,你会被垃圾邮件淹没


如果你打算使用你自己的验证码,这是过分的——它甚至不需要是随机的。简单地要求用户输入一个固定的单词(例如,“在此框中键入‘orange’”)将阻止绝大多数简单的垃圾邮件。

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

$_SESSION['captcha'] = $result;

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

这样做值得花时间和精力吗?重新发明轮子总是一个坏主意。CAPTCHA应该很容易被人类解决,但电脑的作用并不大。您的验证码将阻止大多数垃圾邮件发送者,因为这是一个自制的解决方案,但如果有人想,他们可以在一个小时左右破解它。我会坚持使用reCAPTHCA。@SunnyOne:@Dashwuff任何在后端使用人工的垃圾邮件系统都会使验证码系统变得无用。然而,如果定制了一个spambot来突破您的系统,只需几秒钟就可以编程完成这样一个简单的验证码。问题中的加法会花费稍长的时间,但仍然不会花费任何有经验的程序员不到几分钟的时间。如果你是一个足够有价值的目标,它可能会被破坏或强制执行。如果您使用的验证码是在普通软件中找到的,则情况也是如此。垃圾邮件发送者毁掉了一切(谢谢。回到Recaptcha?不,正如我提到的,那更糟。由于经常遇到Recaptcha,许多常用的垃圾邮件软件会自动识别它并将其传递给人类解算器。实际上,你最好从自己的自定义验证码开始。我真的不知道为什么有人会使用它。)这条路径。键入上述问题所需的时间比与reCAPTCHA集成所需的时间要多。+1感谢您的洞察力。那么唯一的解决方案是reCAPTCHA吗?@SunnyOne,如果您担心用户受到阻碍,那么我认为像reCAPTCHA这样的系统在处理视力受损用户、非英语使用者等方面做了大量工作tc.可能比一次性的更容易访问。避免阻止用户的最佳方法是在用户注册墙之外提供引人注目的内容。顺便说一句,CAPTCHA不会阻止“创建多个帐户”保持低水平。有人愿意在第三世界国家支付低工资工人的工资,仍然可以雇佣人创建帐户。也许忘了提一下:我的网站不是论坛式的,应该是房地产代理……有一天。所以注册是为了插入广告。这很重要吗?谢谢你的回答,我是s直到有点困惑。这么多不同的观点。可以考虑占用更少的服务器端资源。但是用隐藏变量替换$u会话将导致有2$u POST,一个是用户输入,一个是解决方案。这不会导致安全问题吗?有人可以更改我的表单并伪造隐藏字段一次好吧,给机器人一个100%的猜测机制。你不这么认为吗?Thanks@SunnyOne,当然,但您已经依赖于机器人作者,而不是根据您的验证码自定义他们的机器人。