PHP session会话的安全性分析

 更新时间:2011年09月08日 15:25:16   作者:  
会话的用途常常是帮助用户在Web应用程序的各个部分之间跳转,(这句话说的比较不全面,其实主要是为了能共享数据。)
从而达到方便快捷的目的,但是它在存储信息的时候往往会有一些敏感的东西,这些东西可能成为被攻击的目标,如银行的账号、信用卡事务或档案记录等。这就要求在编写代码的时候必须采取安全措施来减少攻击成功的可能性。

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

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 ; }
?>

运行结果如图所示:

这只是一个示例,输出会话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实现登录搜狐广告获取广告联盟数据的方法【附demo源码】

    PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】

    这篇文章主要介绍了PHP实现登录搜狐广告获取广告联盟数据的方法,涉及php基于curl的远程数据操作相关技巧,需要的朋友可以参考下
    2016-10-10
  • 五个PHP程序员工具

    五个PHP程序员工具

    PHP程序员都应该知道的工具在参与了几个大型PHP项目,写了很多PHP代码以后,我发现很多工具可以提高代码质量,简化发布,使得做为PHP开发人员的生涯变得轻松许多。许多这样的工具可能已经为大家所用。但是,由于一些人甚至没有注意到这些工具的存在,我会从此开始,好了,不说废话,下面是我认为所有PHP程序员应该知道的工具列表。
    2008-05-05
  • php判断两个浮点数是否相等的方法

    php判断两个浮点数是否相等的方法

    这篇文章主要介绍了php判断两个浮点数是否相等的方法,涉及php操作浮点数的技巧,比较实用,需要的朋友可以参考下
    2015-03-03
  • php中批量替换文件名的实现代码

    php中批量替换文件名的实现代码

    一个文件夹中有上百个 类似IDR_WEB_BKG_PNG,IDR_WEB_BKG_XML,IDR_WEB_BKG_ICO,文件,一个一个手动更新后缀,太麻烦,就想用PHP批量更新
    2011-07-07
  • Thinkphp结合AJAX长轮询实现PC与APP推送详解

    Thinkphp结合AJAX长轮询实现PC与APP推送详解

    这篇文章主要给大家介绍了关于Thinkphp结合AJAX长轮询实现PC与APP推送的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07
  • PHP iconv 函数转gb2312的bug解决方法

    PHP iconv 函数转gb2312的bug解决方法

    之前写过一篇解决xajax库中文乱码的问题,说到可以用 iconv( "UTF-8", "gb2312" , $FormValues['a']) 来转换,最近发现更好的写法应该是。
    2009-10-10
  • PHP Session_Regenerate_ID函数双释放内存破坏漏洞

    PHP Session_Regenerate_ID函数双释放内存破坏漏洞

    PHP Session_Regenerate_ID函数存在双释放内容破坏问题,远程攻击者可利用此漏洞对应用程序进行拒绝服务攻击,可能导致任意指令执行。
    2011-01-01
  • 配置eAccelerator和XCache扩展来加速PHP程序的执行

    配置eAccelerator和XCache扩展来加速PHP程序的执行

    这篇文章主要介绍了配置eAccelerator和XCache扩展来加速PHP程序的执行的方法,XCache和PHP5.5以来自带的Zend Opcache一样都是在共享内存中存储Opcode的缓存器,需要的朋友可以参考下
    2015-12-12
  • php 判断网页是否是utf8编码的方法

    php 判断网页是否是utf8编码的方法

    这篇文章主要介绍了php 判断网页是否是utf8编码的方法,需要的朋友可以参考下
    2014-06-06
  • windows平台中配置nginx+php环境

    windows平台中配置nginx+php环境

    相对于linux来说,windows配置web环境不管是一键安装包还是独立配置简单多了,这次是讲以NGINX作为web的本地的测试环境。
    2015-12-12

最新评论