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脚本的10个技巧(8)
Oct 09 PHP
PHP教程 预定义变量
Oct 23 PHP
PHP 模拟$_PUT实现代码
Mar 15 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
php与c 实现按行读取文件实例代码
Jan 03 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 PHP
PHP实现搜索时记住状态的方法示例
May 11 PHP
PHP中用Trait封装单例模式的实现
Dec 18 PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 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的中问验证码
2006/11/25 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
一秒学会微信小程序制作table表格
2019/02/14 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
python逆向入门教程
2018/01/15 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
python中Array和DataFrame相互转换的实例讲解
2021/02/03 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
服务标语大全
2014/06/18 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
vue 实现上传组件
2021/05/31 Vue.js
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers