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 相关文章推荐
一个简单的自动发送邮件系统(二)
Oct 09 PHP
php在项目中寻找代码的坏味道(综艺命名)
Jul 19 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
php获取bing每日壁纸示例分享
Feb 25 PHP
ThinkPHP实现批量删除数据的代码实例
Jul 02 PHP
php基于GD库画五星红旗的方法
Feb 24 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
Apr 07 PHP
Laravel 5框架学习之路由、控制器和视图简介
Apr 07 PHP
php实现购物车功能(上)
Jul 23 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
Dec 11 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
php比较相似字符串的方法
2015/06/05 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
用Python中的字典来处理索引统计的方法
2015/05/05 Python
Python语法快速入门指南
2015/10/12 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
python 提取文件指定列的方法示例
2019/08/07 Python
Python sep参数使用方法详解
2020/02/12 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
Django通过json格式收集主机信息
2020/05/29 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
高二学生评语大全
2014/04/25 职场文书
热门专业求职信
2014/05/24 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers