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中使用Oracle数据库(2)
Oct 09 PHP
php checkdate、getdate等日期时间函数操作详解
Mar 11 PHP
php中长文章分页显示实现代码
Sep 29 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
php实现mysql事务处理的方法
Dec 25 PHP
php实现Linux服务器木马排查及加固功能
Dec 29 PHP
初识ThinkPHP控制器
Apr 07 PHP
Yii2中datetime类的使用
Dec 17 PHP
PHPstorm快捷键(分享)
Jul 17 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
php 中的信号处理操作实例详解
Mar 04 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 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
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
JavaScript加强之自定义callback示例
2013/09/21 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
初步解析Python中的yield函数的用法
2015/04/03 Python
Python通过select实现异步IO的方法
2015/06/04 Python
Python序列操作之进阶篇
2016/12/08 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
python requests.post带head和body的实例
2019/01/02 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
致400米运动员广播稿
2014/02/07 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
导师评语大全
2014/04/26 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
班风学风建设方案
2014/05/06 职场文书
2014年超市工作总结
2014/11/19 职场文书
单位实习鉴定评语
2015/01/04 职场文书
仓库管理员岗位职责
2015/02/03 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL