8

我目前在我的网站上的每个页面都有以下代码。请任何人确认这是否是开始和继续 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, '');

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

另一个相关问题:

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

提前致谢!

4

1 回答 1

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 - 您应该能够在线找到示例。

我希望这或多或少能回答你的问题。如果您认为有什么不对劲,请告诉我。

于 2012-05-12T06:22:38.390 回答