为啥我们在做 LOGOUT.php 时同时需要 unset 和 session destroy? [复制]
Posted
技术标签:
【中文标题】为啥我们在做 LOGOUT.php 时同时需要 unset 和 session destroy? [复制]【英文标题】:Why do we need both, unset and session destroy when we are doing LOGOUT.php? [duplicate]为什么我们在做 LOGOUT.php 时同时需要 unset 和 session destroy? [复制] 【发布时间】:2013-09-03 11:09:15 【问题描述】:?php session_start();
if(isset($_SESSION["user_name"]))
if($_GET["destroy"]=="yes")
session_destroy();
unset($_SESSION["user_name"]);
if(!isset($_SESSION["user_name"]) &&
$_GET["user"]!="")
$_SESSION["user_name"] = $_GET["user"];
?>
我想知道,为什么我们需要 unset 和 session_destroy()?我通过删除其中一个进行测试,结果仍然相同。用户仍然注销。请哪位大神解释一下,非常感谢。
【问题讨论】:
谁说你一开始就需要两者?请提供一些参考资料,否则不清楚您真正关心的是什么。 session_unset() 和 unset($_SESSION['user']) 一样吗? 这里来自php.net/manual/en/function.session-destroy.php的链接说,为了完全终止会话,比如注销用户,还必须取消设置会话ID。 在这种情况下,会话ID是user_name? @HamDlink:不,会话 ID 不是会话变量,会话 ID 是实际会话的属性。会话具有:1.) 名称 php.net/session_name,2.) id php.net/session_id 和 3.) 所有会话变量 php.net/$_SESSION。 【参考方案1】:session_unset() 从会话中只删除一个变量 - 会话仍然存在 - 只有数据被截断。但是 session_unset() 是一个过时的 PHP 函数。我们可以将会话设置为空数组。
$_SESSION = array();
session_destroy() 将删除整个会话。 并非总是需要两者都做。但为了确保额外的安全性,建议两者都做。
【讨论】:
session_unset() 是一个过时的 PHP 函数。它最初是与你不再使用的 session_register() 一起使用的(或者如果你使用它,那是你的错), @shrikanth,您的回答确实有道理,因为其中任何一个都会将用户注销,但为了提高安全性,这就是我们同时使用两者的原因。 这里你对安全的理解有误。session_unset()
是为在 PHP 4 中注册为会话变量的全局变量而设计的。正如手册页所说,使用 $_SESSION
时不再需要使用它。在$_SESSION
after session_destroy()
中拥有数据也没有安全隐患,分析器没有给出任何理由以及为什么这实际上是可取的。只是输入了一些没有其他含义的句子。
不要接受这个作为答案,你只是误解了我们发现的问题中的会话 ID 是什么。无需接受错误的答案。不要无缘无故把一个小错误变成另一个错误。
@hakre 是的,你是对的 session_unset() 已经过时了,我们可以将 session 设置为一个 empty array。但是他提到了 session_unset () 在问题中,所以我只是解释了它的作用。【参考方案2】:
unset()
删除一个变量而不是一个会话。
session_destory()
销毁会话。
session_destroy() 销毁所有与当前关联的数据 会议。它不会取消设置与 会话,或取消设置会话 cookie。
但是,我建议您这样做:
$_SESSION = array();
...而不是unset();
【讨论】:
你为什么会这样建议? 它更好。它删除会话数组中的所有值。而不是一一删除。 好吧,OP 只是错误地使用了 unset。首先没有理由使用它,因此也没有理由按照您的建议进行操作。以上是关于为啥我们在做 LOGOUT.php 时同时需要 unset 和 session destroy? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Data Vault 2.0 - 当我们有信息集市时,为啥我们需要业务保险库?
mysql 证明为啥用limit时,offset很大会影响性能