php用户登录之cookie信息安全分析


Posted in PHP onMay 13, 2016

本文实例讲述了php用户登录之cookie信息安全。分享给大家供大家参考,具体如下:

大家都知道用户登陆后,用户信息一般会选择保存在cookie里面,因为cookie是保存客户端,并且cookie可以在客户端用浏览器自由更改,这样将会造成用户cookie存在伪造的危险,从而可能使伪造cookie者登录任意用户的账户。

下面就说说平常一些防止用户登录cookie信息安全的方法:

一、cookie信息加密法

cookie信息加密法即用一种加密方法,加密用户信息,然后在存入cookie,这样伪造者即使得到cookie也只能在cookie有效期内对这个cookie利用,无法另外伪造cookie信息。

这里附上一个加密函数:

<?php
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
  // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
  $ckey_length = 4;
  // 密匙
  $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
  // 密匙a会参与加解密
  $keya = md5(substr($key, 0, 16));
  // 密匙b会用来做数据完整性验证
  $keyb = md5(substr($key, 16, 16));
  // 密匙c用于变化生成的密文
  $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
substr(md5(microtime()), -$ckey_length)) : '';
  // 参与运算的密匙
  $cryptkey = $keya.md5($keya.$keyc);
  $key_length = strlen($cryptkey);
  // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
//解密时会通过这个密匙验证数据完整性
  // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
  $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :
sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  $string_length = strlen($string);
  $result = '';
  $box = range(0, 255);
  $rndkey = array();
  // 产生密匙簿
  for($i = 0; $i <= 255; $i++) {
    $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  }
  // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
  for($j = $i = 0; $i < 256; $i++) {
    $j = ($j + $box[$i] + $rndkey[$i]) % 256;
    $tmp = $box[$i];
    $box[$i] = $box[$j];
    $box[$j] = $tmp;
  }
  // 核心加解密部分
  for($a = $j = $i = 0; $i < $string_length; $i++) {
    $a = ($a + 1) % 256;
    $j = ($j + $box[$a]) % 256;
    $tmp = $box[$a];
    $box[$a] = $box[$j];
    $box[$j] = $tmp;
    // 从密匙簿得出密匙进行异或,再转成字符
    $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  }
  if($operation == 'DECODE') {
    // 验证数据有效性,请看未加密明文的格式
    if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() --> 0) &&
substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
      return substr($result, 26);
    } else {
      return '';
    }
  } else {
    // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
    // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
    return $keyc.str_replace('=', '', base64_encode($result));
  }
}
$str = 'abcdef';
$key = '3water.com';
echo $jm = authcode($str,'ENCODE',$key,0); //加密
echo "
";
echo authcode($jm ,'DECODE',$key,0); //解密
?>

这样当设置用户信息的cookie时,就无法对其进行伪造:

<?php
$user = array("uid"=-->$uid,"username"=>$username);
$user = base64_encode(serialize($user));
$user = authcode($user,'ENCODE','3water.com',0); //加密
setcookie("user",$user,time()+3600*24);
?>

二、用加密令牌对cookie进行保护

$hash = md5($uid.time());//加密令牌值
$hash_expire =time()+3600*24;//加密令牌值为一天有效期
$user = array("uid"=>$uid,"username"=>$username,"hash"=>$hash);
$user = base64_encode(serialize($user));
setcookie("user",$user,$hash_expr);

然后把$hash和$hash_expire 存入member表中hash和hash_expire对应字段中,也可以存入nosql,session

用户伪造cookie时,hash无法伪造,伪造的hash和数据库中的不一致

用户每次登陆,这个hash_expire有效期内不更新hash值,过期则更新

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
php上传图片客户端和服务器端实现方法
Mar 30 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
深入剖析PHP中printf()函数格式化使用
May 23 PHP
一个简单的php路由类
May 29 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
Nov 14 PHP
Laravel中前端js上传图片到七牛云的示例代码
Sep 04 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 PHP
PHP数组函数知识汇总
May 12 #PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 #PHP
php similar_text()函数的定义和用法
May 12 #PHP
php使用curl并发减少后端访问时间的方法分析
May 12 #PHP
php反射类ReflectionClass用法分析
May 12 #PHP
PHP 的比较运算与逻辑运算详解
May 12 #PHP
php使用文本统计访问量的方法
May 12 #PHP
You might like
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
javascript之学会吝啬 精简代码
2010/04/25 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
vue router 源码概览案例分析
2018/10/09 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
校园摄影活动策划方案
2014/02/05 职场文书
运动会稿件50字
2014/02/17 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
2015年高中生国庆节演讲稿
2015/07/30 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书