快速高效的PHP会话

时间:2012-05-12 05:18:49

标签: php performance session

我目前在我的网站上的每个页面都有以下代码。请任何人确认这是一个好的做法,开始并继续PHP会话吗?

//************************************************************
//Session Settings
//************************************************************

$session_name = 'PHPSESSID'; 
$session_exp_time = 10000; 

$previous_name = session_name($session_name);

//Set garbage collection parameters
ini_set('session.gc_maxlifetime',   $session_exp_time);
ini_set('session.gc_probability', '1');
ini_set('session.gc_divisor', '100');

ini_set('session.name', $session_name);
ini_set('session.cookie_domain', ''); //Session set to not be available to subdomains
ini_set('session.cookie_lifetime', 0);

//Set the session cookie parameters
session_set_cookie_params($session_exp_time, '/', '');

//Start or continue a session...
@session_start();

if (isset($_COOKIE[$session_name]))
setcookie($session_name, $_COOKIE[$session_name], 2147483647, '');

请注意,此脚本包含在每个页面中。

另一个相关问题:

我应该设置自定义会话保存路径还是应该只使用服务器的默认会话保存路径?优缺点都有什么?据我所知,如果你没有设置自定义会话保存路径,那么你可能在共享主机上遇到某种冲突?请帮忙指教。

提前致谢!

1 个答案:

答案 0 :(得分:4)

您的许多陈述都涉及会话配置设置;这些通常可以在服务器的php.ini或顶级.htaccess(Apache)中移动。

session.name = PHPSESSID
session.gc_maxlifetime = 10000

session.gc_probability = 1
session.gc_divisor = 1000

session.cookie_domain =
session.cookie_path = /
session.cookie_httponly = 1
session.cookie_lifetime = 0

你不应该像你一样长时间休息(2038年到期);会话通常与会话cookie一直延续(从技术上讲,它持续到浏览器关闭为止)。如果您想要实现“记住我”功能,建议您在会话之外添加该功能,如下所述:http://jaspan.com/improved_persistent_login_cookie_best_practice

我发现区分开始新会话和恢复现有会话很重要,尤其是在会话仅作为登录过程的一部分创建的情况下。当会话无法恢复时,出现问题,应将用户重定向回登录页面(或主页)。

PHP不理解这种差异,session_start会自动创建会话(如果不存在),更糟糕的是,如果给出了任意会话ID;后者允许会话采用攻击,如下所述:http://gihyo.jp/dev/serial/01/php-security/0025 - 它是日语,您必须使用浏览器进行翻译。

要确定是否可以恢复会话,您需要通过添加特殊密钥(例如$_SESSION['_id'] = session_id())来填充每个新会话。如果找到该密钥,则会话已存在,您可以恢复该密钥;如果没有,会话要​​么不存在,要么有人试图给你一个错误的ID。

要开始一个新会话,首先要看它是否可以恢复;如果没有,则使用session_regenerate_id(true)更改会话ID(这会使攻击者更难劫持会话)。

最后,共享服务器上的会话保存路径可以写在您自己的主文件夹下,但这只有在共享主机与每个虚拟主机的专用用户(即suexec)一起运行时才有意义。否则,为了保护您的会话免受窥探攻击,您必须对会话数据进行编码(也可能是密钥)。查看mcrypt扩展程序:http://sg.php.net/mcrypt - 您应该可以在线查找示例。

我希望这或多或少能回答你的问题。如果你觉得有什么不妥,请告诉我。