PHP session会话的安全性分析

从而达到方便快捷的目的,但是它在存储信息的时候往往会有一些敏感的东西,这些东西可能成为被攻击的目标,如银行的账号、信用卡事务或档案记录等。这就要求在编写代码的时候必须采取安全措施来减少攻击成功的可能性。

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

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,也无法进行破坏,能够减少对系统造成的损失。

(0)

相关推荐

  • php简单的会话类代码

    复制代码 代码如下: <?php class session { static $sessionObject; /* $_SESSION['user'] == 0 , don't work . * == 1 , he is really user . */ private function __construct() { if(! ( isset($_SESSION['user']) && $_SESSION['user']==0 )) session_set_cookie_para

  • PHP会话控制实例分析

    本文实例讲述了PHP会话控制.分享给大家供大家参考,具体如下: 关于cookie和session的测试代码: <?php session_start(); define('u','a'); define('p','1'); if (isset($_GET['r']) && $_GET['r']== 1) { unset($_COOKIE['username']); unset($_COOKIE['password']); unset($_SESSION['valid_login'])

  • php通过会话控制实现身份验证实例

    会话控制的思想就是指能够在网站中根据一个会话跟踪用户.这里整理了详细的代码,有需要的小伙伴可以参考下. 概述 http 协议是无状态的,对于每个请求,服务端无法区分用户.PHP 会话控制就是给了用户一把钥匙(一个加密session字符串),同时这也是用户身份的一个证明,服务端存放了这把钥匙能打开的箱子(数据库,内存数据库或者使用文件做的),箱子里面装的就是用户的各个变量信息. 传统的php session 使用 <?php //page1.php 启动一个会话并注册一个变量 session_st

  • php中session_id()函数详细介绍,会话id生成过程及session id长度

    php中session_id()函数原型及说明session_id()函数说明:stringsession_id([string$id])session_id() 可以用来获取/设置 当前会话 ID.为了能够将会话 ID 很方便的附加到 URL 之后, 你可以使用常量 SID 获取以字符串格... php中session_id()函数原型及说明 session_id()函数说明: string session_id ([ string $id ] ) session_id() 可以用来获取/设置

  • php实现session自定义会话处理器的方法

    本文实例讲述了php实现session自定义会话处理器的方法.分享给大家供大家参考.具体分析如下: session自定义会话处理器,即就是说,所有关于session的各种操作,都可以通过自定义会话来自己决定.什么意思呢?先来看php.ini里的session.save_handler配置. 默认情况下,session.save_handler = files,表示调用的是系统定义好的处理器(所谓处理器,其实就是一大堆函数/方法).您可从将session.save_handler设置成 user

  • PHP入门教程之会话控制技巧(cookie与session)

    本文实例讲述了PHP会话控制技巧.分享给大家供大家参考,具体如下: Demo1.php <form method="get" action="Demo2.php"> 姓名:<input type="text" name="username" /> <br /> <input type="submit" value="提交" /> </

  • 使用PHP会话(Session)实现用户登陆功能

    对比起 Cookie,Session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 Session 的使用. 由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容.实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多. 对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名

  • PHP会话控制:Session与Cookie详解

    本文介绍了PHP会话控制,主要阐述以下几点内容: • 会话控制的产生背景/概念 • cookie的维护与生命周期(有效时间) • session的维护与生命周期(回收机制) • cookie与session之间的区别与联系 • 问题1:禁用cookie后session为什么会失效? • 问题2:IE浏览器下丢失session,每次刷新页面,都会生成新的sessionID(Firefox浏览器正常) • session.cookie简单实例 理解会话控制的概念 理解一个概念就需要理解他的背景及产生

  • php使用Cookie实现和用户会话的方法

    本文实例讲述了php使用Cookie实现和用户会话的方法.分享给大家供大家参考.具体分析如下: PHP 包含了很多的函数,可以用来管理和记录用户信息,包括简单的 cookie 和全方位的用户会话.会话使用 PHP 语言内建的技术,使得保存状态就像是引用超全局变量那样简单. 1.Cookie 简介 我们可以和 PHP 脚本一起使用 cookie 来存储一些关于用户的较小的信息. Cookie 是由用户浏览器存储的少量数据,它和一个来自服务器或脚本的请求一致.通过一个用户的浏览器,一个单个的主机可以

  • 比较全的PHP 会话(session 时间设定)使用入门代码

    对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证.如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担.因为我们并不能 只做一次验证.为什么呢?因为客户端 Cookie 中的信息是有可能被修改的.假如你存储 $admin 变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin 

随机推荐