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学习之function的用法
Jul 14 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
php分页示例分享
Apr 30 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
Dec 16 PHP
ThinkPHP实现更新数据实例详解(demo)
Jun 29 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
php技巧小结【推荐】
Jan 19 PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 PHP
php生成短网址/短链接原理和用法实例分析
May 29 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
用PHP创建PDF中文文档
2006/10/09 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
vue脚手架中配置Sass的方法
2018/01/04 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
原生JS实现留言板
2020/03/26 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
大学生简单自荐信
2013/11/10 职场文书
大学学风建设方案
2014/05/04 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
个人查摆剖析材料
2014/10/04 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
介绍信范文大全
2015/05/07 职场文书
Python中22个万用公式的小结
2021/07/21 Python
Python 数据可视化之Bokeh详解
2021/11/02 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python