我目前在我的网站上的每个页面都有以下代码.请任何人确认这是一个良好的做法,以启动和继续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, '');
Run Code Online (Sandbox Code Playgroud)
请注意,此脚本包含在每个页面中.
另一个相关问题:
我应该设置自定义会话保存路径还是应该只使用服务器的默认会话保存路径?优缺点都有什么?据我所知,如果你没有设置自定义会话保存路径,那么你可能在共享主机上遇到某种冲突?请大家指教.
提前致谢!
您的许多陈述涉及会话配置设置; 那些通常可以在服务器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
Run Code Online (Sandbox Code Playgroud)
你不应该像你一样长时间休息(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 - 您应该能够在线查找示例.
我希望这或多或少能回答你的问题.如果你认为有什么不妥,请告诉我.