为背景,这里是我的情况:如何(如果可能)设置和取消设置会话变量/停止会话Cookie覆盖?
我建立一个自托管平台,为一个特定的利基,以及该平台的一部分,登录过程,如果验证设置用户的会话。在每个管理页面加载时,会话都会启动并检查变量$_SESSION['key']
以查看是否为真。
如果它是错误的,用户会被重定向到登录页面,并显示错误提示他们再次登录。
的问题是,这是依赖于会话cookie被设置或不设置,因为当会话cookie过期,并在会话开始与session_start()
感检查$_SESSION['key']
,因此创建具有默认值的新会话cookie(我使用session_set_cookie_params()
来改变路径,超时等),使得无法重新登录,因为会话cookie不会覆盖我所能看到的内容。
为了解决这个问题我想过检查$_SESSION['key']
,这将创建一个5秒的会话cookie时使用类似session_set_cookie_params(5, ..)
session_start()
之前,因此允许重新登录时要创建一个新的,但我我不确定这是否会起作用 - 而且我也确定必须有一种更有效的方法来设置/取消设置会话变量?
这里是我的代码:
启动会话,如果验证登录
if($validated){
session_set_cookie_params(1800, "/inst", $server_name['home']);
session_name("_inst");
session_start();
$_SESSION['key'] = true;
}
检查$ _SESSION [ '关键']仍然是正确的
session_name("_inst");
session_start();
if(!$_SESSION['key']) {
header('Location: ' . $server['home'] . '/login/?error=1');
}
任何答案或建议将太棒了,请问你是否需要澄清任何事情!
我听到你在说什么,但是我是否仍然需要取消密钥设置?我希望在用户需要重新登录之前为用户提供最长的登录时间(例如12小时)。如果我不改变默认的cookie参数,我将如何能够做到这一点?我很抱歉,如果我没有说清楚,我现在意识到我没有真正提到为什么我使用'session_set_cookie_params()'函数。底线是,除非让会议下降,否则我需要每12小时取消设置/设置'$ _SESSION ['key']'变量。 – Avicinnian
你应该在php.ini中设置cookie生命周期,所以它在所有页面中都是全局的,这样所有的session_start()调用都会在适当的过期时间内创建一个新的cookie(如果需要的话)。您还必须确保PHP的会话垃圾收集器在12小时内不会启动(还有更多。ini设置也是如此),否则你最终还是会得到有效的会话cookie,但没有匹配的会话文件,因为PHP已经清理了它。 –
啊,我没有意识到PHP有一个会话垃圾收集器。在这种情况下,我会简单地使用默认值。此外,我完全不符合会话cookie背后的逻辑,我没有想到意识到尽管您不能覆盖它的参数,但您仍然可以更改其密钥的值。我会接受你的回答,因为它确实有意义,现在我已经考虑过了。 – Avicinnian