目前我网站上的每个页面都有以下代码。请任何人确认这是否是开始和继续 PHP session 的好习惯?
//************************************************************
//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, '');
请注意,此脚本包含在每个页面中。
另一个相关问题:
我应该设置自定义 session 保存路径还是只使用服务器的默认 session 保存路径?优缺点都有什么?据我了解,如果您不设置自定义 session 保存路径,那么您可能会在共享主机上发生某种冲突吗?请大家帮忙指教。
提前致谢!
最佳答案
您的许多语句都涉及 session 配置设置;这些通常可以在服务器的 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
你不应该让 session 持续那么久(2038 年到期); session 通常使用 session cookie 永久保存(从技术上讲,它会持续到浏览器关闭为止)。如果您想实现“记住我”功能,我建议您将其添加到您的 session 之上,如下所述:http://jaspan.com/improved_persistent_login_cookie_best_practice
我发现区分开始新 session 和恢复现有 session 很重要,尤其是在 session 仅作为登录过程的一部分创建的情况下。当 session 无法恢复时,出现了错误,用户应该被重定向回登录页面(或主页)。
PHP 不理解这种区别,如果 session 不存在,session_start
将自动创建一个 session ,更糟糕的是,如果给出任意 session ID;后者允许进行 session 采用攻击,如下所述:http://gihyo.jp/dev/serial/01/php-security/0025 - 它是日语,您必须使用浏览器进行翻译。
要确定 session 是否可以恢复,您需要通过添加特殊 key (例如 $_SESSION['_id'] = session_id()
)来启动每个新 session 。如果找到该 key ,则 session 已经存在,您可以恢复它;如果不是,则 session 不存在或有人试图向您提供错误的 ID。
开始一个新的session,首先要看是否可以resume;如果不是,则使用 session_regenerate_id(true)
更改 session ID(这使攻击者更难劫持 session )。
最后,共享服务器上的 session 保存路径可以写在您自己的主文件夹下,但这只有在您的共享主机与每个虚拟主机的专用用户一起运行时才有意义(即 suexec
)。否则,为了保护您的 session 免受窥探攻击,您将不得不对 session 数据(可能还有 key )进行编码。查看 mcrypt
扩展:http://sg.php.net/mcrypt - 您应该能够在线找到示例。
我希望这或多或少能回答您的问题。如果您认为有任何问题,请告诉我。
关于php - 快速高效的 PHP Session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10561280/