您好!欢迎访问家园网-www.jy.wang!

家园网

请举例讲解php中session的安全攻防问题。

网络 作者:本站 点击:

PHP Session安全攻防详解

一、Session劫持攻击与防御

攻击原理

攻击者获取用户的Session ID后,冒充用户身份访问系统

攻击方式

  1. 网络嗅探‌:截获未加密的HTTP请求获取Session ID

  2. XSS攻击‌:通过JavaScript窃取document.cookie

  3. 预测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验证失败');
    }
}

参数详解

参数类型说明
namestring自定义Session名称,避免使用默认PHPSESSID
cookie_lifetimeintCookie有效期(秒),0表示浏览器关闭失效
cookie_pathstringCookie作用路径,'/'表示全站有效
cookie_domainstringCookie作用域,可设子域名
cookie_securebooltrue表示仅HTTPS传输Cookie
cookie_httponlybooltrue禁止JavaScript访问Cookie
cookie_samesitestring'Strict'/'Lax'限制跨站请求携带Cookie
use_strict_modebooltrue启用严格模式防止固定会话攻击
use_only_cookiesint1表示禁用URL传递Session ID
hash_functionstringSession ID哈希算法(sha1/sha256等)
hash_bits_per_characterint4-6控制Session ID长度和字符集

二、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参数

参数类型说明
lifetimeintCookie有效期(秒)
pathstring服务器上有效路径
domainstringCookie作用域
securebool是否仅HTTPS传输
httponlybool是否禁止JS访问
samesitestring同站策略('Lax'/'Strict')

2. session_regenerate_id()

重新生成Session ID

参数类型说明
delete_old_sessionbool是否删除旧Session数据

3. session_destroy()

销毁Session数据(需先调用session_start())

4. session_unset()

释放所有Session变量(不销毁Session本身)

七、最佳实践总结

  1. 强制HTTPS‌:确保cookie_secure启用

  2. 禁用URL传递‌:设置use_only_cookies=1

  3. 严格模式‌:启用use_strict_mode

  4. 定期更新ID‌:关键操作后调用session_regenerate_id(true)

  5. 绑定用户特征‌:记录User-Agent/IP等(注意移动端IP变化)

  6. 合理设置过期‌:结合空闲超时和绝对超时

  7. 输入过滤‌:严格校验写入Session的数据

  8. CSRF防护‌:重要操作使用Token验证

  9. 安全存储‌:自定义处理器时注意SQL注入等问题

  10. 日志记录‌:记录异常Session访问

通过以上措施,可以显著提高PHP Session的安全性,防范大多数常见的Session相关攻击。

标签: