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新手谈谈我的学习心得
Feb 25 PHP
PHP PDO函数库详解
Apr 27 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
thinkphp3.2实现上传图片的控制器方法
Apr 28 PHP
浅谈php中urlencode与rawurlencode的区别
Sep 05 PHP
Django中的cookie与session操作实例代码
Aug 17 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHP判断是否是微信打开还是浏览器打开的方法
Feb 27 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 PHP
YII2框架中日志的配置与使用方法实例分析
Mar 18 PHP
PHP使用PDO 连接与连接管理操作实例分析
Apr 21 PHP
PHP code 验证码生成类定义和简单使用示例
May 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
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
PHP闭包(Closure)使用详解
2013/05/02 PHP
PHP使用递归生成文章树
2015/04/21 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
JavaScript网页定位详解
2014/01/13 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
Python实现的HMacMD5加密算法示例
2018/04/03 Python
对numpy中轴与维度的理解
2018/04/18 Python
通过Pandas读取大文件的实例
2018/06/07 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
用python读取xlsx文件
2020/12/17 Python
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
公交公司毕业生求职信
2014/02/15 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
社会公德演讲稿
2014/05/20 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
监察建议书
2015/02/04 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书