PHP4 Session定制与使用指南
PHP4的Session功能虽然比现代PHP版本简单,但在其时代是革命性的。以下是如何在PHP4中定制和使用Session功能的指南。
基本Session使用
php
<?php
// 启动session
session_start();
// 设置session变量
$_SESSION['username'] = 'john_doe';
$_SESSION['last_login'] = time();
// 读取session变量
echo "Welcome back, " . $_SESSION['username'];
?>
自定义Session存储
1. 自定义Session保存路径
php
// 在php.ini中设置
session.save_path = "/tmp/custom_sessions"
// 或在脚本中动态设置
ini_set('session.save_path', '/tmp/custom_sessions');
2. 使用自定义Session处理器
php
// 自定义session处理器类
class MySessionHandler {
var $lifetime = 3600; // 1小时
function open($save_path, $session_name) {
// 初始化代码
return true;
}
function close() {
// 清理代码
return true;
}
function read($id) {
// 从自定义存储读取session数据
// 返回空字符串表示session不存在
}
function write($id, $sess_data) {
// 将session数据写入自定义存储
return true;
}
function destroy($id) {
// 删除session数据
return true;
}
function gc($maxlifetime) {
// 垃圾回收
return true;
}
}
// 注册自定义处理器
$handler = new MySessionHandler();
session_set_save_handler(
array(&$handler, 'open'),
array(&$handler, 'close'),
array(&$handler, 'read'),
array(&$handler, 'write'),
array(&$handler, 'destroy'),
array(&$handler, 'gc')
);
Session安全增强
1. 自定义Session ID生成
php
function my_session_id() {
return md5(uniqid(mt_rand(), true));
}
session_id(my_session_id());
session_start();
2. 防止Session固定攻击
php
session_start();
if (!isset($_SESSION['initiated'])) {
session_regenerate_id();
$_SESSION['initiated'] = true;
}
3. 设置Session过期时间
php
// 设置session cookie过期时间(30分钟)
ini_set('session.cookie_lifetime', 1800);
ini_set('session.gc_maxlifetime', 1800);
数据库存储Session示例
php
class DBSessionHandler {
var $db;
function open($save_path, $session_name) {
$this->db = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('sessions', $this->db);
return true;
}
function close() {
return mysql_close($this->db);
}
function read($id) {
$id = mysql_real_escape_string($id);
$sql = "SELECT data FROM sessions WHERE id='$id'";
$result = mysql_query($sql, $this->db);
if ($row = mysql_fetch_assoc($result)) {
return $row['data'];
}
return '';
}
function write($id, $data) {
$id = mysql_real_escape_string($id);
$data = mysql_real_escape_string($data);
$sql = "REPLACE INTO sessions VALUES('$id', '$data', NOW())";
return mysql_query($sql, $this->db);
}
function destroy($id) {
$id = mysql_real_escape_string($id);
$sql = "DELETE FROM sessions WHERE id='$id'";
return mysql_query($sql, $this->db);
}
function gc($maxlifetime) {
$sql = "DELETE FROM sessions WHERE last_access < DATE_SUB(NOW(), INTERVAL $maxlifetime SECOND)";
return mysql_query($sql, $this->db);
}
}
// 使用示例
$handler = new DBSessionHandler();
session_set_save_handler(
array(&$handler, 'open'),
array(&$handler, 'close'),
array(&$handler, 'read'),
array(&$handler, 'write'),
array(&$handler, 'destroy'),
array(&$handler, 'gc')
);
注意事项:
1.PHP4的Session功能比现代PHP版本简单,缺少一些安全特性
2.在PHP4中,session_set_save_handler()必须在session_start()之前调用
3.自定义Session处理器的方法名在PHP4中是固定的
4.PHP4默认使用文件存储Session,可能在高流量站点上成为性能瓶颈
5.考虑升级到更新的PHP版本以获得更好的Session支持和安全性