background image

session 数据暴露
会话数据常会包含一些个人信息和其它敏感数据。基于这个原因,会话数据的暴露是被普遍
关心的问题。一般来说,暴露的范围不会很大,因为会话数据是保存在服务器环境中的,而
不是在数据库或文件系统中。因此,会话数据自然不会公开暴露。
使用

SSL 是一种特别有效的手段,它可以使数据在服务器和客户端之间传送时暴露的可能

性降到最低。这对于传送敏感数据的应用来说非常重要。

SSL 在 HTTP 之上提供了一个保护

层,以使所有在

HTTP 请求和应答中的数据都得到了保护。

如果你关心的是会话数据保存区本身的安全,你可以对会话数据进行加密,这样没有正确
的密钥就无法读取它的内容。这在

PHP 中非常容易做到,你只要使用

session_set_save_handler( )并写上你自己的 session 加密存储和解密读取的处理函数即可。
session 劫持
最常见的针对会话的攻击手段是会话劫持。它是所有攻击者可以用来访问其它人的会话的手
段的总称。所有这些手段的第一步都是取得一个合法的会话标识来伪装成合法用户,因此保
证会话标识不被泄露非常重要。前面关于会话暴露和固定的知识能帮助你保证会话标识只有
服务器及合法用户才能知道。
深度防范原则可以用在会话上,当会话标识不幸被攻击者知道的情况下,一些不起眼的安
全措施也会提供一些保护。作为一个关心安全的开发者,你的目标应该是使前述的伪装过程
变得更复杂。记住无论多小的障碍,都会以你的应用提供保护。
把伪装过程变得更复杂的关键是加强验证。会话标识是验证的首要方法,同时你可以用其它
数据来补充它。你可以用的所有数据只是在每个

HTTP 请求中的数据:

GET / HTTP/1.1
Host: example.org
User-Agent: Firefox/1.0
Accept: text/html, image/png, image/jpeg, image/gif, *

/*

Cookie: PHPSESSID=1234
你应该意识到请求的一致性,并把不一致的行为认为是可疑行为。例如,虽然

User-

Agent(发出本请求的浏览器类型)头部是可选的,但是只要是发出该头部的浏览器通常都不
会变化它的值。如果你一个拥有

1234 的会话标识的用户在登录后一直用 Mozilla Firfox 浏览

器,突然转换成了

IE,这就比较可疑了。例如,此时你可以用要求输入密码方式来减轻风

险,同时在误报时,这也对合法用户产生的冲击也比较小。你可以用下面的代码来检测
User-Agent 的一致性:
代码如下

:

<?php
session_start();
if (isset($_SESSION['HTTP_USER_AGENT']))
{

 

if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))

 

{

    

/* Prompt for password */

    exit

;

 

}

}

else

{