php安全:session会话劫持防范与会话固定

一、概述

对于Web应用程序来说,加强安全性的第一条原则就是——不要信任来自客户端的数据,一定要进行数据验证以及过滤才能在程序中使用,进而保存到数据层。然而,由于Http的无状态性,为了维持来自同一个用户的不同请求之间的状态,客户端必须发送一个唯一的身份标识符(Session ID)来表明自己的身份。很显然,这与前面提到的安全原则是相违背的,但是没有办法,为了维持状态,我们别无选择,这也导致了Session在web应用程序中是十分脆弱的一个环节。 由于PHP内置的Session管理机制并没有提供安全处理,所以,开发人员需要建立相应的安全机制来防范会话攻击。针对Session的攻击手段主要有会话劫持(Session hijacking)和会话固定(Session fixation)两种。

二、会话劫持(Session hijacking)

会话劫持(Session hijacking),这是一种通过获取用户Session ID后,使用该Session ID登录目标账号的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。会话劫持的第一步是取得一个合法的会话标识来伪装成合法用户,因此需要保证会话标识不被泄漏。

攻击步骤:

  • 目标用户需要先登录站点;
  • 登录成功后,该用户会得到站点提供的一个会话标识SessionID;
  • 攻击者通过某种攻击手段捕获Session ID;
  • 攻击者通过捕获到的Session ID访问站点即可获得目标用户合法会话。

攻击者获取SessionID的方式有多种:

  • 暴力破解:尝试各种Session ID,直到破解为止;
  • 预测:如果Session ID使用非随机的方式产生,那么就有可能计算出来;
  • 窃取:使用网络嗅探,XSS攻击等方法获得。
PHP内部Session的实现机制虽然不是很安全,但是关