为啥我们在做 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 - 当我们有信息集市时,为啥我们需要业务保险库?

使用 php 和 jquery mobile 的导航问题

JWT 为啥我们需要 Bearer word?

mysql 证明为啥用limit时,offset很大会影响性能

cookie 过期时调用“wp_logout”(php 或 javascript)

批量购买时选择的同时显示合计数