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 命名空间实例说明
Jan 27 PHP
php之CodeIgniter学习笔记
Jun 17 PHP
php查询mssql出现乱码的解决方法
Dec 29 PHP
smarty模板引擎中自定义函数的方法
Jan 22 PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP生成加减算法方式的验证码实例
Mar 12 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
PHP中抽象类,接口功能、定义方法示例
Feb 26 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 PHP
解决laravel查询构造器中的别名问题
Oct 17 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中strlen和mb_strlen函数的区别
2014/03/07 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
JS 动态获取节点代码innerHTML分析 [IE,FF]
2009/11/30 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
2020/11/09 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
使用python绘制常用的图表
2016/08/27 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
python 调用有道api接口的方法
2019/01/03 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
高级工程师英文求职信
2014/03/19 职场文书
个人工作总结范文2014
2014/11/07 职场文书
大学生十八大感想
2015/08/11 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python