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 相关文章推荐
PHP垃圾回收机制简单说明
Jul 22 PHP
一个显示效果非常不错的PHP错误、异常处理类
Mar 21 PHP
php+xml结合Ajax实现点赞功能完整实例
Jan 30 PHP
CodeIgniter使用smtp服务发送html邮件的方法
Jun 10 PHP
PHP模拟asp.net的StringBuilder类实现方法
Aug 08 PHP
php中时间函数date及常用的时间计算
May 12 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
PHP5.5新特性之yield理解与用法实例分析
Jan 11 PHP
PHP中PCRE正则解析代码详解
Apr 26 PHP
解决php extension 加载顺序问题
Aug 16 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
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
PHP7新功能总结
2019/04/14 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
javascript正则表达式总结
2016/02/29 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
Vue实现验证码功能
2019/12/03 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
python在windows下创建隐藏窗口子进程的方法
2015/06/04 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Python学习笔记之变量、自定义函数用法示例
2019/05/28 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
护理学毕业生自荐信
2013/10/02 职场文书
妇科医生自荐信
2013/11/05 职场文书
初三家长会邀请函
2014/01/18 职场文书
迟到检讨书大全
2014/01/25 职场文书
《桂林山水》教学反思
2014/02/08 职场文书
亲子活动总结
2014/04/26 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
文案策划岗位职责
2015/02/11 职场文书
MySQL注入基础练习
2021/05/30 MySQL