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 相关文章推荐
Dedecms常用函数解析
Feb 01 PHP
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
Sep 10 PHP
火车采集器 免费版使出收费版本功能实现原理
Sep 17 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
Mar 26 PHP
PHP代码审核的详细介绍
Jun 13 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
php的4种常见运行方式
Mar 20 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
Oct 15 PHP
提高Laravel应用性能方法详解
Jun 24 PHP
laravel使用数据库测试注意事项
Apr 10 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
海贼王:最美的悬赏令!
2020/03/02 日漫
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
php实现登陆模块功能示例
2016/10/20 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
wxpython学习笔记(推荐查看)
2014/06/09 Python
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
剖析Python的Twisted框架的核心特性
2016/05/25 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
详解python Todo清单实战
2018/11/01 Python
django-初始配置(纯手写)详解
2019/07/30 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
小学教师的自我评价范例
2013/10/31 职场文书
公司前台接待岗位职责
2013/12/03 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
社区工作感言
2014/02/21 职场文书
财务总监管理职责范文
2014/03/09 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
个人承诺书格式
2014/06/03 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server