PHP session会话的安全性分析


Posted in PHP onSeptember 08, 2011

从而达到方便快捷的目的,但是它在存储信息的时候往往会有一些敏感的东西,这些东西可能成为被攻击的目标,如银行的账号、信用卡事务或档案记录等。这就要求在编写代码的时候必须采取安全措施来减少攻击成功的可能性。

主要的安全措施有以下两个方面。

1、防止攻击者获取用户的会话ID。

获取会话ID的方式很多,攻击者可以通过查看明文通信来获取,所以把会话ID放在URL中或者放在通过未加密连接传输的Cookie中是很危险的;还有在URL中(作为_get()参数)传递会话ID也是不安全的,因为浏览器历史缓存中会存储URL,这样就很容易被读取。(可以考虑使用ssh进行加密传输)

还有一种更为隐蔽的攻击手段,攻击者通过一个被脚本攻击突破的Web站点,把被突破的这个站点上的用户重新定向到另一个站点,然后在重新定向的站点的URL中插入以下代码:
?PHPSESSID=213456465412312365465412312;

最后发送到Web应用程序。当用户查看Web应用程序时,PHP会发现没有与这个会话ID相关联的数据并且会创建一些数据。用户不知道发生了什么,但攻击者却知道了会话ID,就可以利用这个会话ID进入应用程序。

要防止这种攻击,有两种方法。
(1)检查php.ini中是否打开了session.use_only_cookie。如果是这种情况,PHP会拒绝基于URL的会话ID。
(2)当启动会话时,在会话数据中放一个变量,这个变量表示会话是用户创建的;如果发现会话数据中没有这个变量,那就说明会话ID是假的,就可以调用session_regenerate_id函数,给现有会话分配一个新的会话ID。

示例:

通过判断变量是否存在来确定会话ID的真假,如果存在,则说明会话ID是真的,否则是假的,并使用session_regenerate_id()函数对会话ID进行更改,重新给会话创建一个新的会话ID,

代码如下:

< ?php 
session_start () ; 
if (!isset ( $_SESSION['shili1'] )) { //判断shili1变量是否配置 
$old_id = session_id () ; //原来的会话ID的变量名 
session_regenerate_id () ; //获取一个新的会话ID 
$new_id = session_id () ; //新的会话ID的变量名 
echo "old : $old_id<br/>" ; //输出原来的会话ID 
echo "new : $new_id<br/>" ; //输出新的会话ID 
$_SESSION['shili1'] = TRUE ; } 
?>

运行结果如图所示:
PHP session会话的安全性分析
这只是一个示例,输出会话ID是为了更好的理解和应用这个函数,而在程序设计中是不需要输出会话ID的。

2、限制攻击者获取会话ID。

限制攻击者获取会话ID的方法如下。
(1)使用一个函数(md5)计算User-Agent头加上某些附加字符串数据后的散列值(hash)。(散列函数(hash function)接受一个任意大的数据集,并且将它转换为一个看起来完全不同的数据,这个数据很短。产生的散列值是完全不可重现的,也不可能由另一个输入产生。)

在User-Agent字符串后面添加一些数据,攻击者就无法通过对常见的代理值计算md5编码来试探User-Agent字符串。

(2)将这个经过编码的字符串保存在用户的会话数据中。
(3)每次从这个用户接收到请求时,检查这个散列值。

此方案的代码如下:

<?php 
define ( ‘ua_seed','webapp' ) ; 
session_start () ; 
if ( !isset($_SESSION['user_agent'] )){ 
$_SESSION['user_agent'] = md5 ( $_SERVER['HTTP_USER_AGENT'].ua_seed ); 
}else{ 
if ($_SESSION['user_agent'] != md5($_SERVER['HTTP_USER_AGENT'].ua_seed)){} } 
?>

通过给攻击者制造一些麻烦,使攻击者即使获取了会话ID,也无法进行破坏,能够减少对系统造成的损失。
PHP 相关文章推荐
一些使用频率比较高的php函数
Oct 03 PHP
PHP 多维数组排序实现代码
Aug 05 PHP
推荐一本PHP程序猿都应该拜读的书
Dec 31 PHP
微信access_token的获取开发示例
Apr 16 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
Jan 14 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
PHP重定向与伪静态区别
Feb 19 PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 PHP
详解thinkphp中的volist标签
Jan 15 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
Mar 30 PHP
PHP中16个高危函数整理
Sep 19 PHP
php7 list()、session及其他模块的修改实例分析
May 25 PHP
php中实现简单的ACL 完结篇
Sep 07 #PHP
php将时间差转换为字符串提示
Sep 07 #PHP
php 中英文语言转换类
Sep 07 #PHP
php继承的一个应用
Sep 06 #PHP
php 抽象类的简单应用
Sep 06 #PHP
PHP中PDO基础教程 入门级
Sep 04 #PHP
PHP中PDO的错误处理
Sep 04 #PHP
You might like
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
2018/04/20 jQuery
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
selenium+python实现自动登录脚本
2018/04/22 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
Python同时迭代多个序列的方法
2020/07/28 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
合作协议书模板2014
2014/09/26 职场文书
2014年党建工作总结
2014/11/11 职场文书
唐山大地震的观后感
2015/06/05 职场文书
招商银行工作证明
2015/06/17 职场文书
大学生暑期实践报告
2015/07/13 职场文书
严以用权学习心得体会
2016/01/12 职场文书