PHP session会话的安全性分析
2015-01-24信息快讯网
会话的用途常常是帮助用户在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中serialize序列化与json性能测试的示例分析
使用Apache的htaccess防止图片被盗链的解决方法
Eclipse中php插件安装及Xdebug配置的使用详解
基于python发送邮件的乱码问题的解决办法
PHP中如何调用webservice的实例参考
php class中self,parent,this的区别以及实例介绍
PHP中::、->、self、$this几种操作符的区别介绍
关于Iframe如何跨域访问Cookie和Session的解决方法
php简单开启gzip压缩方法(zlib.output_compression)
file_get_contents获取不到网页内容的解决方法
php连接mssql数据库的几种方法
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
PHP中通过语义URL防止网站被攻击的方法分享
php中实现简单的ACL 完结篇
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
PHP IF ELSE简化/三元一次式的使用
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
php中使用Curl、socket、file_get_contents三种方法POST提交数据
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
php简单的会话类代码
php中设置多级目录session的问题
应用开发中涉及到的css和php笔记分享
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
关于php连接mssql:pdo odbc sql server
从手册去理解分析PHP session机制
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法