PHP Session安全攻防详解
一、Session劫持攻击与防御
攻击原理
攻击者获取用户的Session ID后,冒充用户身份访问系统
攻击方式
网络嗅探:截获未加密的HTTP请求获取Session ID
XSS攻击:通过JavaScript窃取document.cookie
预测Session ID:猜测或暴力破解Session ID
防御代码示例
// 1. 设置Session安全参数
session_start([
'name' => 'SECURE_SESSID', // 自定义Session名称
'cookie_lifetime' => 86400, // Cookie有效期(秒)
'cookie_path' => '/', // Cookie路径
'cookie_domain' => '.example.com', // 作用域
'cookie_secure' => true, // 仅HTTPS传输
'cookie_httponly' => true, // 禁止JS访问
'cookie_samesite' => 'Strict', // 同站策略
'use_strict_mode' => true, // 严格模式
'use_only_cookies' => 1, // 仅用Cookie
'hash_function' => 'sha256', // 哈希算法
'hash_bits_per_character' => 5 // ID编码密度
]);
// 2. 绑定用户特征
$_SESSION['user_fingerprint'] = hash('sha256',
$_SERVER['HTTP_USER_AGENT'] .
$_SERVER['REMOTE_ADDR'] .
'salt_string'
);
// 3. 验证Session
function validateSession() {
$currentFingerprint = hash('sha256',
$_SERVER['HTTP_USER_AGENT'] .
$_SERVER['REMOTE_ADDR'] .
'salt_string'
);
if ($_SESSION['user_fingerprint'] !== $currentFingerprint) {
session_regenerate_id(true); // 强制生成新ID
session_destroy();
die('Session验证失败');
}
}参数详解
二、Session固定攻击与防御
攻击原理
攻击者预先设置Session ID并诱导用户使用
防御代码
// 1. 登录时重新生成Session ID
function login($username, $password) {
// 验证逻辑...
// 销毁旧Session
session_regenerate_id(true);
// 重新生成指纹
$_SESSION['user_fingerprint'] = hash('sha256',
$_SERVER['HTTP_USER_AGENT'] .
$_SERVER['REMOTE_ADDR'] .
'salt_string'
);
// 设置登录标记
$_SESSION['logged_in'] = true;
$_SESSION['last_activity'] = time();
}
// 2. session_regenerate_id参数
/*
* @param bool $delete_old_session
* true - 删除旧Session数据
* false - 保留旧Session(默认)
*/三、Session注入攻击与防御
攻击原理
通过篡改Session数据执行恶意操作
防御代码
// 1. 序列化处理器安全设置
ini_set('session.serialize_handler', 'php_serialize'); // 更安全的处理器
// 2. 输入过滤
function setSessionData($key, $value) {
if (!preg_match('/^[a-z_]+$/', $key)) {
throw new Exception('非法Session键名');
}
// 过滤数组值
if (is_array($value)) {
$_SESSION[$key] = filter_var_array($value, FILTER_SANITIZE_SPECIAL_CHARS);
}
// 过滤标量值
else {
$_SESSION[$key] = filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS);
}
}
// 3. 重要操作二次验证
function criticalAction() {
if (empty($_SESSION['csrf_token']) ||
$_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF验证失败');
}
// 执行重要操作...
}四、Session过期管理
攻击场景
利用长期有效的Session进行未授权访问
防御代码
// 1. 设置Session过期时间(秒)
ini_set('session.gc_maxlifetime', 1800); // 30分钟
// 2. 实现空闲超时
function checkSessionTimeout() {
$timeout = 1800; // 30分钟
if (isset($_SESSION['last_activity']) &&
(time() - $_SESSION['last_activity']) > $timeout) {
session_unset();
session_destroy();
header('Location: /login?timeout=1');
exit;
}
$_SESSION['last_activity'] = time();
}
// 3. 绝对过期时间
if (!isset($_SESSION['created'])) {
$_SESSION['created'] = time();
} elseif (time() - $_SESSION['created'] > 86400) { // 24小时
session_regenerate_id(true);
$_SESSION['created'] = time();
}五、完整安全配置示例
// 安全Session配置函数
function secureSessionStart() {
// 1. 基本安全设置
$sessionName = 'SECURE_' . md5($_SERVER['HTTP_HOST']);
$secure = true; // 仅HTTPS
$httponly = true; // 禁止JS访问
// 2. 设置Cookie参数
session_set_cookie_params([
'lifetime' => 0, // 浏览器关闭失效
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'secure' => $secure,
'httponly' => $httponly,
'samesite' => 'Strict'
]);
// 3. 更改Session名称
session_name($sessionName);
// 4. 启动Session
session_start();
// 5. 防止会话固定
if (!isset($_SESSION['initiated'])) {
session_regenerate_id(true);
$_SESSION['initiated'] = true;
}
// 6. 验证用户代理
if (isset($_SESSION['user_agent'])) {
if ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id(true);
$_SESSION = array();
session_destroy();
die('会话异常');
}
} else {
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
// 7. 验证IP(可选,对动态IP用户不友好)
/*
if (isset($_SESSION['user_ip'])) {
if ($_SESSION['user_ip'] !== $_SERVER['REMOTE_ADDR']) {
session_regenerate_id(true);
$_SESSION = array();
session_destroy();
die('IP变更');
}
} else {
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
}
*/
}六、关键安全函数详解
1. session_set_cookie_params()
设置Session Cookie参数
2. session_regenerate_id()
重新生成Session ID
3. session_destroy()
销毁Session数据(需先调用session_start())
4. session_unset()
释放所有Session变量(不销毁Session本身)
七、最佳实践总结
强制HTTPS:确保
cookie_secure启用禁用URL传递:设置
use_only_cookies=1严格模式:启用
use_strict_mode定期更新ID:关键操作后调用
session_regenerate_id(true)绑定用户特征:记录User-Agent/IP等(注意移动端IP变化)
合理设置过期:结合空闲超时和绝对超时
输入过滤:严格校验写入Session的数据
CSRF防护:重要操作使用Token验证
安全存储:自定义处理器时注意SQL注入等问题
日志记录:记录异常Session访问
通过以上措施,可以显著提高PHP Session的安全性,防范大多数常见的Session相关攻击。