php你的验证码安全码?

验证码的作用主要有防止暴力破解,防止恶意灌水,防止自动提交等,在这里我就不多说了。验证码的类型也有数字、字母等,甚至厉害点的还有中文的。但是不管你的验证码多么厉害,只要你在表单验证中存在如下的失误,你的验证码就形同虚设!

验证码的一般思路,就是每次登陆的地方访问一个脚本文件,该文件生成含验证码的图片并将值写入到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" onclick= this.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访问一下验证码的页面,就可以只提交用户名、密码、刚才得到的验证码实现暴力破解了,利用此方法,同样可以实现灌水,刷票等。
大家可以看下面的图片,增强点直观的认识。
=700) window.open('http://www.phpinsider.cn/attachment/Mon_0612/18_3_335a47d2eb1b627.gif');" src="http://www.phpinsider.cn/attachment/Mon_0612/18_3_335a47d2eb1b627.gif" onload="if(this.width>'700')this.width='700';if(this.height>'700')this.height='700';" border=0>

解决方法:我们需要在检查密码错误后更新验证码,对于留言等类型的,还要在提交成功后更新验证码。

安全就是这样,我们总是想让自己的程序更安全,但是一般情况下,我们又总是走在常规思维里跳不出来,于是导致我们的程序出现了很多"非常规漏洞",或者叫做"缺陷",总之就是不完美。我写这篇文章除了指出上面这个问题之外,还希望大家都能行动起来,用"非常规"眼光,重新检查下自己的程序,把更多以前自己没有发现的小问题帖出来,让大家共同提高!

(0)

相关推荐

  • 一个PHP验证码类代码分享(已封装成类)

    复制代码 代码如下: <?php session_start(); Header("Content-type: image/gif"); class SecurityCode { private $codes = ''; function __construct() { $code = '0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z'; $codeArray = explode('-

  • PHP 动态随机生成验证码类代码

    下面是效果图,这个效果图是没有开启干扰码的效果图 下面是类代码 复制代码 代码如下: <?php /************************************************ //FILE:ImageCode //DONE:生成动态验证码类 //DATE"2010-3-31 //Author:www.5dkx.com 5D开心博客 *********************************************************************

  • php 生成随机验证码图片代码

    复制代码 代码如下: <?php /** 默认首页 **/ class DefaultController extends AppController { public function index() { $len = 5; $str = "ABCDEFGHIJKLNMPQRSTUVWXYZ123456789"; $im = imagecreatetruecolor ( 70, 20 ); $bgc = imagecolorallocate($im, 255, 255, 255

  • 修改了一个很不错的php验证码(支持中文)

    php英文验证码captcha.class.php 复制代码 代码如下: <?php class Captcha { private $width; private $height; private $codeNum; private $code; private $im; function __construct($width=80, $height=20, $codeNum=4) { $this->width = $width; $this->height = $height; $t

  • php图片验证码代码

    复制代码 代码如下: <?php     //文件头...     header("Content-type: image/png");     //创建真彩色白纸     $im = @imagecreatetruecolor(50, 20) or die("建立图像失败");     //获取背景颜色     $background_color = imagecolorallocate($im, 255, 255, 255);     //填充背景颜色(这

  • php中文字母数字验证码实现代码

    英文同数字 <?php Header("Content-type:image/png"); //定义header,声明图片文件,最好是png,无版权之扰;  //生成新的四位整数验证码 session_start();//开启session; $authnum_session = '';  $str = 'abcdefghijkmnpqrstuvwxyz1234567890';  //定义用来显示在图片上的数字和字母; $l = strlen($str); //得到字串的长度; 

  • PHP验证码类代码( 最新修改,完全定制化! )

    Authnum.class.php 下载 复制代码 代码如下: <?php session_start(); class Authnum { //图片对象.宽度.高度.验证码长度 private $im; private $im_width; private $im_height; private $len; //随机字符串.y轴坐标值.随机颜色 private $randnum; private $y; private $randcolor; //背景色的红绿蓝,默认是浅灰色 public $

  • php 数学运算验证码实现代码

    复制代码 代码如下: <?php //------------------------------------- // 文件说明:数学运算验证码 // 文件作者:Jesse Lee // 最后更新:2008-09-07 //------------------------------------- session_start(); $sessionvar = 'vdcode'; //Session变量名称 $width = 150; //图像宽度 $height = 20; //图像高度 $op

  • php5 图片验证码实现代码

    GD库的函数 1,imagecreatetruecolor -----创建一个真彩色的图像 imagecreatetruecolor(int x_size,int y_size) //x表示宽,y表示高 2,imagecolorallocate 为一幅图像分配颜色(调色板) imagecolorallocate(resource image,int red,int green,int blue)//red,green,blue----三原色 3,imagestring 绘图函数 iamgestr

  • PHP 验证码的实现代码

    checkcode.php 生成验证码图片,还有变量 $_SESSION[check_pic]. 复制代码 代码如下: <? session_start(); for($i=0; $i<4; $i++){ $rand.= dechex(rand(1,15)); } $_SESSION[check_pic]=$rand; //echo $_SESSION[check_pic]; // 设置图片大小 $im = imagecreatetruecolor(100,30); // 设置颜色 $bg=i

  • php 验证码制作(网树注释思想)

    1,生成随机数 用for循环确定生成几个随机数. 用随机函数生成范围内随机数.例如rand(1,15),生成1到15之间的数字. 用16位进制函数把生成数字字母化.dechex(rand(1,15)). 用.=运算来保存几个数字. 把生成好的随机数放到$_SESSION[变量].等将来跟用户提交的内容比较. 2,创建图片 用图片创建函数确定,所创建的图片大小. 例如$im = imagecreatetruecolor(100,30);其中坐标100,30是以网页左上角为原点,$im为图片变量了.

随机推荐