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 相关文章推荐
我的论坛源代码(八)
Oct 09 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
php对文件进行hash运算的方法
Apr 03 PHP
php防止网站被攻击的应急代码
Oct 21 PHP
php 截取utf-8格式的字符串实例代码
Oct 30 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
May 02 PHP
php使用str_replace替换多维数组的实现方法分析
Jun 15 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
Jun 04 PHP
启用OPCache提高PHP程序性能的方法
Mar 21 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
IIS6的PHP最佳配置方法
2007/03/19 PHP
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
php数组和链表的区别总结
2019/09/20 PHP
学习从实践开始之jQuery插件开发 对话框插件开发
2012/04/26 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
python 切换root 执行命令的方法
2019/01/19 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
Python小进度条显示代码
2019/03/05 Python
python实现微信打飞机游戏
2020/03/24 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
联想台湾官网:Lenovo TW
2018/05/09 全球购物
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
客服服务心得体会
2013/12/30 职场文书
中学教师请假制度
2014/02/03 职场文书
幼儿园优秀教师事迹
2014/02/13 职场文书
生日寄语大全
2014/04/08 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
环境建议书
2015/02/04 职场文书
小王子读书笔记
2015/06/29 职场文书
Python实现8种常用抽样方法
2021/06/27 Python
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏
Elasticsearch 配置详解
2022/04/19 Java/Android
Linux下搭建SFTP服务器的命令详解
2022/06/25 Servers