找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 855|回复: 0
打印 上一主题 下一主题

php你的验证码安全码?

[复制链接]

2536

主题

2536

帖子

7532

积分

论坛元老

Rank: 8Rank: 8

积分
7532
跳转到指定楼层
楼主
发表于 2018-2-14 09:25:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            验证码的作用主要有防止暴力破解,防止恶意灌水,防止自动提交等,在这里我就不多说了。验证码的类型也有数字、字母等,甚至厉害点的还有中文的。但是不管你的验证码多么厉害,只要你在表单验证中存在如下的失误,你的验证码就形同虚设!
验证码的一般思路,就是每次登陆的地方访问一个脚本文件,该文件生成含验证码的图片并将值写入到Session里,提交的时候验证登陆的脚本就会判断提交的验证码是否与Session里的一致。
问题出现了,在登陆密码错误之后,我们不去访问生成验证图片的文件,那么如果Session中的验证码没有被清空,此时验证码就是跟上次的一样,辛辛苦苦构建的验证码机制就形同虚设了。
下面我们先来看一段有问题的代码:
登陆部分:
CODE:
[color=]tr
>
         
[color=]td
>
[color=]管理员姓名:
[color=]td
>
         
[color=]td
>
[color=]input type
=
[color=]"text"
[color=]name
=
[color=]"username"
/>
[color=]td
>
      
[color=]tr
>
      
[color=]tr
>
         
[color=]td
>
[color=]管理员密码:
[color=]td
>
         
[color=]td
>
[color=]input type
=
[color=]"password"
[color=]name
=
[color=]"password"
/>
[color=]td
>
      
[color=]tr
>
            
[color=]tr
>
         
[color=]td
>
[color=]验证码:
[color=]td
>
         
[color=]td
>
[color=]input type
=
[color=]"text"
[color=]name
=
[color=]"captcha"
[color=]onkeyup
=
[color=]"pressCaptcha(this)"
/>
[color=]td
>
      
[color=]tr
>
      
[color=]tr
>
      
[color=]td colspan
=
[color=]"2"
[color=]align
=
[color=]"right"
>
      
[color=]
=
[color=]"index.php?act=captcha&1628020115"
[color=]width
=
[color=]"145"
[color=]height
=
[color=]"20"
[color=]alt
=
[color=]"CAPTCHA"
[color=]border
=
[color=]"1"
[color=]onclick
=
[color=]this
.
[color=]src
=
[color=]"index.php?act=captcha&"
+
[color=]Math
.
[color=]random
()
[color=]style
=
[color=]"cursor: pointer;"
[color=]title
=
[color=]"看不清?点击更换另一个验证码。"
/>
      
[color=]td
>
      
[color=]tr
>
[color=]?>
这里没什么问题,来看登陆验证的代码(我想这样的验证思路,也是大多数人都在用的吧):
CODE:
/*------------------------------------------------------ */
//-- 验证登陆信息
/*------------------------------------------------------ */
if (
[color=]$_REQUEST
[
[color=]'act'
] ==
[color=]'signin'
)
{
    include(
[color=]'../includes/cls_captcha.php'
);
   /* 检查验证码是否正确 */
   
[color=]$validator
= new
[color=]captcha
();
   if (!
[color=]$validator
->
[color=]check_word
(
[color=]$_POST
[
[color=]'captcha'
]))
   {
      
[color=]sys_msg
(
[color=]$_LANG
[
[color=]'captcha_error'
],
[color=]1
);
    }
    /* 检查密码是否正确 */
   
[color=]$sql
=
[color=]"SELECT user_id, user_name, password, action_list FROM "
.
[color=]$ecs
->
[color=]table
(
[color=]'admin_user'
).
            
[color=]" WHERE user_name='$_POST[username]' AND password='"
.
[color=]md5
(
[color=]$_POST
[
[color=]'password'
]).
[color=]"'"
;
   
[color=]$row
=
[color=]$db
->
[color=]GetRow
(
[color=]$sql
);
    if (
[color=]$row
)
    {
        // 登录成功
        
[color=]set_admin_session
(
[color=]$row
[
[color=]'user_id'
],
[color=]$row
[
[color=]'user_name'
],
[color=]$row
[
[color=]'action_list'
]);
        // 更新最后登录时间和IP
        
[color=]$db
->
[color=]Execute
(
[color=]"UPDATE "
.
[color=]$ecs
->
[color=]table
(
[color=]'admin_user'
).
                    
[color=]" SET last_time='"
.
[color=]date
(
[color=]'Y-m-d H:i:s'
,
[color=]time
()).
[color=]"', last_ip='"
.
[color=]real_ip
().
[color=]"'"
.
                    
[color=]" WHERE user_id=$_SESSION[admin_id]"
) OR die(
[color=]$db
->
[color=]ErrorMsg
());
        if (isset(
[color=]$_POST
[
[color=]'remember'
]))
        {
            
[color=]setcookie
(
[color=]'ECSCP[admin_id]'
,   
[color=]$row
[
[color=]0
],
[color=]time
() +
[color=]3600
*
[color=]24
*
[color=]360
);
            
[color=]setcookie
(
[color=]'ECSCP[admin_pass]'
,  
[color=]md5
(
[color=]$row
[
[color=]'password'
] .
[color=]$_CFG
[
[color=]'hash_code'
]),
[color=]time
() +
[color=]3600
*
[color=]24
*
[color=]360
);
        }
        
[color=]header
(
[color=]'location:./'
);
    }
    else
    {
        
[color=]sys_msg
(
[color=]$_LANG
[
[color=]'login_faild'
],
[color=]1
);
    }
}
[color=]?>
问题就出在上面这段代码里,在检查密码错误之后,并没有更新验证码,这样我们就可以把登陆页面的验证码图片部分去掉,而只要用URL访问一下验证码的页面,就可以只提交用户名、密码、刚才得到的验证码实现暴力破解了,利用此方法,同样可以实现灌水,刷票等。
大家可以看下面的图片,增强点直观的认识。[B][/B]
[I]=700) window.open('http://www.phpinsider.cn/attachment/Mon_0612/18_3_335a47d2eb1b627.gif');" src="http://www.phpinsider.cn/attachment/Mon_0612/18_3_335a47d2eb1b627.gif" onload="if(this.width>'700')this.width='700';if(this.height>'700')this.height='700';" border=0>
解决方法:我们需要在检查密码错误后更新验证码,对于留言等类型的,还要在提交成功后更新验证码。
安全就是这样,我们总是想让自己的程序更安全,但是一般情况下,我们又总是走在常规思维里跳不出来,于是导致我们的程序出现了很多"非常规漏洞",或者叫做"缺陷",总之就是不完美。我写这篇文章除了指出上面这个问题之外,还希望大家都能行动起来,用"非常规"眼光,重新检查下自己的程序,把更多以前自己没有发现的小问题帖出来,让大家共同提高!
            
            
您可能感兴趣的文章:
  • 修改了一个很不错的php验证码(支持中文)
  • php图片验证码代码
  • php中文字母数字验证码实现代码
  • php 验证码制作(网树注释思想)
  • php 数学运算验证码实现代码
  • php5 图片验证码实现代码
  • php 生成随机验证码图片代码
  • PHP 动态随机生成验证码类代码
  • PHP验证码类代码( 最新修改,完全定制化! )
  • PHP 验证码的实现代码
  • 一个PHP验证码类代码分享(已封装成类)
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端