一.使用session跟踪:
使用session模块,session_start()函数初始化一个session,并可以通过自动全局数组$_SESSION访问,通过PHP程序保持对相应变量的跟踪、
默认情况下,PHP把session数据保存在服务器端的/tmp文件夹下,每个session都保存为其自己的文件。要想改变保存文件的路径,可以把php.ini文件中的session.save_path配置指令设置为新的指令,也可以通过ini_set()函数来设置新路径
二.预防Session劫持:
方案:只允许通过cookie来传递sessionID,同时生成一个由URL传递的额外session记号。只有当请求包含有效的sessionID和有效的session记号,才可以访问该session。
<?php
ini_set('session.use_only_cookies', true);
session_start();
$salt = 'YourSpecialValueHere';
$tokenstr = (str) date('W').$salt;
$token = md5($tokenstr);
if (!isset($_REQUEST['token']) || $_REQUEST['token'] != $token) {
// 提示用户登录
exit();
}
$_SESSION['token'] = $token;
output_add_rewrite_var('token', $token);
?>
通过当前星期的数字与你的特殊话连接起来,经过md5加密,创建了一个记号,记号可以在一定的时间内使用而不必修改。
当我们检查到请求中没有包含这个记号时,我们会提示用户登录。
如果有这个记号,就把它附加到生成的链接上。用output_add_rewrite_var()函数
三.预防session定置
要求不会把session标识符附加到URL上的session cookie,并且频繁的生成新的sessionID。
<?php
ini_set('session.use_only_cookies', true);
session_start();
if (!isset($_SESSION['generate']) || $_SESSION['generate'] < (time() - 30)) {
session_regenerate_id();
$_SESSION['generate'] = time();
}
?>
当session启动后,我们设置了一个值,用于记录上次生成sessionID的时间,通过请求一个定期(本例30s)生成的新ID,使得攻击者获取有效的sessionID的机会大大降低。