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开发GUI
Oct 09 PHP
实用函数7
Nov 08 PHP
linux iconv方法的使用
Oct 01 PHP
php+highchats生成动态统计图
May 21 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
微信公众平台开发实现2048游戏的方法
Apr 15 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
列举PHP的Yii 2框架的开发优势
Jul 03 PHP
PHP下载远程图片并保存到本地方法总结
Jan 22 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
Laravel框架实现多数据库连接操作详解
Jul 12 PHP
Laravel 解决composer相关操作提示php相关异常的问题
Oct 23 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 采集程序 常用函数
2008/12/18 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
jquery简单体验
2007/01/10 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
如何获取vue单文件自身源码路径
2019/05/06 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
pycharm设置注释颜色的方法
2018/05/23 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
电子商务专业自我鉴定
2013/12/18 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
检讨书格式
2015/01/23 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python