设为首页 收藏本站
查看: 576|回复: 0

[经验分享] 你的php验证码安全吗?

[复制链接]

尚未签到

发表于 2017-4-3 11:26:31 | 显示全部楼层 |阅读模式
验证码的作用主要有防止暴力破解,防止恶意灌水,防止自动提交等,在这里我就不多说了。验证码的类型也有数字、字母等,甚至厉害点的还有中文的。但是不管你的验证码多么厉害,只要你在表单验证中存在如下的失误,你的验证码就形同虚设!

验证码的一般思路,就是每次登陆的地方访问一个脚本文件,该文件生成含验证码的图片并将值写入到Session里,提交的时候验证登陆的脚本就会判断提交的验证码是否与Session里的一致。

问题出现了,在登陆密码错误之后,我们不去访问生成验证图片的文件,那么如果Session中的验证码没有被清空,此时验证码就是跟上次的一样,辛辛苦苦构建的验证码机制就形同虚设了。

下面我们先来看一段有问题的代码:
登陆部分: <tr>
<td>管理员姓名:</td>
<td><inputtype="text"name="username"/></td>
</tr>
<tr>
<td>管理员密码:</td>
<td><inputtype="password"name="password"/></td>
</tr>
<tr>
<td>验证码:</td>
<td><inputtype="text"name="captcha"onkeyup="pressCaptcha(this)"/></td>
</tr>
<tr>
<tdcolspan="2"align="right">
<imgsrc="index.php?act=captcha&1628020115"width="145"height="20"alt="CAPTCHA"border="1"onclick=this.src="index.php?act=captcha&"+Math.random()style="cursor:pointer;"title="看不清?点击更换另一个验证码。"/>
</td>
</tr>
  
这里没什么问题,来看登陆验证的代码(我想这样的验证思路,也是大多数人都在用的吧):
<?php
/*------------------------------------------------------*/
//--验证登陆信息
/*------------------------------------------------------*/
if($_REQUEST['act']=='signin')
{
include('../includes/cls_captcha.php');

/*检查验证码是否正确*/
$validator=newcaptcha();
if(!$validator->check_word($_POST['captcha']))
{
sys_msg($_LANG['captcha_error'],1);
}

/*检查密码是否正确*/
$sql="SELECTuser_id,user_name,password,action_listFROM".$ecs->table('admin_user').
"WHEREuser_name='$_POST[username]'ANDpassword='".md5($_POST['password'])."'";
$row=$db->GetRow($sql);

if($row)
{
//登录成功
set_admin_session($row['user_id'],$row['user_name'],$row['action_list']);

//更新最后登录时间和IP
$db->Execute("UPDATE".$ecs->table('admin_user').
"SETlast_time='".date('Y-m-dH:i:s',time())."',last_ip='".real_ip()."'".
"WHEREuser_id=$_SESSION[admin_id]")ORdie($db->ErrorMsg());

if(isset($_POST['remember']))
{
setcookie('ECSCP[admin_id]',$row[0],time()+3600*24*360);
setcookie('ECSCP[admin_pass]',md5($row['password'].$_CFG['hash_code']),time()+3600*24*360);
}

header('location:./');
}
else
{
sys_msg($_LANG['login_faild'],1);
}
}
?>
  问题就出在上面这段代码里,在检查密码错误之后,并没有更新验证码,这样我们就可以把登陆页面的验证码图片部分去掉,而只要用URL访问一下验证码的页面,就可以只提交用户名、密码、刚才得到的验证码实现暴力破解了,利用此方法,同样可以实现灌水,刷票等。
大家可以看下面的图片,增强点直观的认识。

  解决方法:我们需要在检查密码错误后更新验证码,对于留言等类型的,还要在提交成功后更新验证码。


安全就是这样,我们总是想让自己的程序更安全,但是一般情况下,我们又总是走在常规思维里跳不出来,于是导致我们的程序出现了很多"非常规漏洞",或者叫做"缺陷",总之就是不完美。我写这篇文章除了指出上面这个问题之外,还希望大家都能行动起来,用"非常规"眼光,重新检查下自己的程序,把更多以前自己没有发现的小问题写出来,让大家共同提高!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359527-1-1.html 上篇帖子: PHP获得目录列表和文件列表 下篇帖子: php字符串截长(支持中文)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表