1

我的 PHP 会话随机到期,并且很少持续超过大约 5 分钟(300 秒)。

我在这里试验 PHP 和 MySQL 登录脚本:http: //www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL(下面提取的 sec_session_start 函数)。

function sec_session_start() {
    $session_name = 'sec_session_id'; // Set a custom session name
    $secure = false; // Set to true if using https.
    $httponly = true; // This stops javascript being able to access the session id. 

    ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
    $cookieParams = session_get_cookie_params(); // Gets current cookies params.
    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); 
    session_name($session_name); // Sets the session name to the one set above.
    session_start(); // Start the php session
    session_regenerate_id(true); // regenerated the session, delete the old one.     
}

我已经对该主题进行了广泛的阅读以尝试解决问题,并了解许多原因导致 PHP 会话过早过期。如果您对如何解决问题有任何想法,请告诉我,因为问题让我发疯!

请注意:
1. 在 php.ini 中我设置了 session.gc_maxlifetime = 3600
2. 我的主机是 IPage。
2. 我尝试将 session_set_cookie_params 编辑为以下内容,但并没有解决问题:

    session_set_cookie_params( time()+1800, "/", $cookieParams["domain"], $secure, $httponly); 
4

3 回答 3

2

您的代码对每个会话都有一个不变的名称?您是否考虑过每次有人开始一个新会话时都会破坏前一个会话?会话标识符是唯一的是有原因的。

除此之外,问问你的主人。他们可能会做一些荒谬的事情,比如每 X 分钟清除一次 /tmp。

于 2012-11-05T20:39:52.297 回答
0

它可能与此处描述的问题相同: http ://www.php.net/manual/en/function.session-regenerate-id.php#84242

这是浏览器问题,而不是php。(在 Firefox 中重新创建比在 Chrome 中更容易)设置“session_regenerate_id(false);” 有帮助,但这违背了安全登录的目的。

于 2012-11-05T21:14:01.453 回答
0

我有一个类似的登录脚本,当我查看我设置的 cookie 时找到了解决方案。由于某种原因,此脚本会在启动全新会话时为 example.com 和 www.example.com 设置 cookie。在 session_set_cookie_params() 中显式设置您的域将解决此问题。

function sec_session_start() {
    $domain = 'example.com'; // note $domain
    $session_name = 'sec_session_id'; // Set a custom session name
    $secure = true; // Set to true if using https.
    $httponly = true; // This stops javascript being able to access the session id. 
    ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
    $cookieParams = session_get_cookie_params(); // Gets current cookies params.
    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $domain, $secure, $httponly); // note $domain
    session_name($session_name); // Sets the session name to the one set above.
    session_start(); // Start the php session
    session_regenerate_id(true); // regenerated the session, delete the old one.     
}
于 2013-04-23T20:35:12.713 回答