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学习之php4与php5之间会穿梭一点点感悟
May 03 PHP
PHP 函数执行效率的小比较
Oct 17 PHP
《PHP编程最快明白》第八讲:php启发和小结
Nov 01 PHP
php文档更新介绍
Jul 22 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
Aug 21 PHP
php打印一个边长为N的实心和空心菱型的方法
Mar 02 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
关于laravel后台模板laravel-admin select框的使用详解
Oct 03 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
PHP的重载使用魔术方法代码实例详解
Feb 26 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
js html实现计算器功能
2018/11/13 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
2019/05/01 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
python设置检查点简单实现代码
2014/07/01 Python
Python代码调试的几种方法总结
2015/04/15 Python
Python多线程爬虫简单示例
2016/03/04 Python
python九九乘法表的实例
2017/09/26 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
Python高并发和多线程有什么关系
2020/11/14 Python
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
复古服装:RetroStage
2019/05/10 全球购物
促销活动策划方案
2014/01/12 职场文书
时尚休闲吧创业计划书
2014/01/25 职场文书
企业文化建设实施方案
2014/03/22 职场文书
小学生作文评语
2014/04/18 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
邓小平文选读书笔记
2015/06/29 职场文书