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中的内存管理,PHP动态分配和释放内存
Jun 28 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
PHP四种基本排序算法示例
Apr 09 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
Dec 25 PHP
基于PHP后台的Android新闻浏览客户端
May 23 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
Dec 14 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 PHP
PHP7 list() 函数修改
Mar 09 PHP
PHP解决高并发问题
Apr 01 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 Socket 编程
2010/04/09 PHP
基于php常用正则表达式的整理汇总
2013/06/08 PHP
php递归实现无限分类的方法
2015/07/28 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
python实现汉诺塔算法
2021/03/01 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
Python实现代码统计工具
2019/09/19 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
工程预算与管理应届生求职信
2013/10/06 职场文书
志愿者服务感言
2014/02/27 职场文书
区级文明单位申报材料
2014/05/15 职场文书
国际贸易系求职信
2014/08/09 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技