2011-11-04 129 views
0

为背景,这里是我的情况:如何(如果可能)设置和取消设置会话变量/停止会话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'); 
} 

任何答案或建议将太棒了,请问你是否需要澄清任何事情!

回答

2

只需在所有页面上发出session_start()。这会无条件为你创建一个会话,然后你可以检查钥匙的存在/ abscence:

<?php 

session_start(); 

if (!isset($_SESSSION['key'])) { // never logged in, or were logged in and got logged out 
    ... redirect to login ... 
    exit(); 
} 

if ($_SESSION['key'] != 'expected value') { // logged in, but no longer a valid login. 
    ... redirect to login ... 
    exit(); 
} 

你不应该乱用会话cookie设置的。保持默认状态,只需检查相关密钥即可。如果他们不在那里,那么用户没有登录并应该被重定向。

如果他们的会话已经过期并且PHP清理了会话文件,那么他们已经被有效注销,即使他们拥有一个它是有效的一个时间点会话密钥,并且应该重定向到重新登录。

+0

我听到你在说什么,但是我是否仍然需要取消密钥设置?我希望在用户需要重新登录之前为用户提供最长的登录时间(例如12小时)。如果我不改变默认的cookie参数,我将如何能够做到这一点?我很抱歉,如果我没有说清楚,我现在意识到我没有真正提到为什么我使用'session_set_cookie_params()'函数。底线是,除非让会议下降,否则我需要每12小时取消设置/设置'$ _SESSION ['key']'变量。 – Avicinnian

+0

你应该在php.ini中设置cookie生命周期,所以它在所有页面中都是全局的,这样所有的session_start()调用都会在适当的过期时间内创建一个新的cookie(如果需要的话)。您还必须确保PHP的会话垃圾收集器在12小时内不会启动(还有更多。ini设置也是如此),否则你最终还是会得到有效的会话cookie,但没有匹配的会话文件,因为PHP已经清理了它。 –

+0

啊,我没有意识到PHP有一个会话垃圾收集器。在这种情况下,我会简单地使用默认值。此外,我完全不符合会话cookie背后的逻辑,我没有想到意识到尽管您不能覆盖它的参数,但您仍然可以更改其密钥的值。我会接受你的回答,因为它确实有意义,现在我已经考虑过了。 – Avicinnian