php你的验证码安全码?


Posted in PHP onJanuary 02, 2007

验证码的作用主要有防止暴力破解,防止恶意灌水,防止自动提交等,在这里我就不多说了。验证码的类型也有数字、字母等,甚至厉害点的还有中文的。但是不管你的验证码多么厉害,只要你在表单验证中存在如下的失误,你的验证码就形同虚设!

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

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

下面我们先来看一段有问题的代码:
登陆部分:

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

   

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

    

/* 检查密码是否正确 */
    
$sql "SELECT user_id, user_name, password, action_list FROM " .$ecs->table('admin_user'). 
            
" WHERE user_name='$_POST[username]' AND password='" .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'). 
                    
" SET last_time='" .date('Y-m-d H:i:s'time()). "', last_ip='" .real_ip(). "'".
                    
" WHERE user_id=$_SESSION[admin_id]") OR die($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访问一下验证码的页面,就可以只提交用户名、密码、刚才得到的验证码实现暴力破解了,利用此方法,同样可以实现灌水,刷票等。
大家可以看下面的图片,增强点直观的认识。
php你的验证码安全码?

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

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

PHP 相关文章推荐
PHP中的正规表达式(二)
Oct 09 PHP
非常不错的MySQL优化的8条经验
Mar 24 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 PHP
逆序二维数组插入一元素的php代码
Jun 08 PHP
解析link_mysql的php版
Jun 30 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 PHP
php实现统计网站在线人数的方法
May 12 PHP
php仿微信红包分配算法的实现方法
May 13 PHP
微信支付开发发货通知实例
Jul 12 PHP
php实现的表单验证类完整示例
Aug 13 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 PHP
一个PHP操作Access类(PHP+ODBC+Access)
Jan 02 #PHP
一个用php实现的获取URL信息的类
Jan 02 #PHP
PHP 和 MySQL 开发的 8 个技巧
Jan 02 #PHP
Smarty结合Ajax实现无刷新留言本实例
Jan 02 #PHP
Ajax PHP分页演示
Jan 02 #PHP
windows下PHP APACHE MYSQ完整配置
Jan 02 #PHP
PHP Ajax实现页面无刷新发表评论
Jan 02 #PHP
You might like
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
php封装的验证码类分享
2017/02/26 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
php自动加载代码实例详解
2021/02/26 PHP
jquery随机展示头像代码
2011/12/21 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
如何更好的编写js async函数
2018/05/13 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
js实现碰撞检测
2021/01/29 Javascript
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
Selenium的使用详解
2018/10/19 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
python动态文本进度条的实例代码
2020/01/22 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
如何理解委托
2012/01/06 面试题
优秀驾驶员先进事迹材料
2014/05/04 职场文书
学习十八大的心得体会
2014/09/12 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
优秀团员自我评价
2015/03/10 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
2016教师节问候语
2015/11/10 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
大学生,三分钟即兴演讲稿
2019/07/22 职场文书
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python