【问题标题】:PHP $_SESSION variable will not unsetPHP $_SESSION 变量不会取消设置
【发布时间】:2012-08-30 18:52:46
【问题描述】:

对不起,我在这个论坛上看到了一些重复的问题,但没有一个对我有用...

我正在使用 php 会话构建一个基本登录,我是新手...

login.php 验证 html 登录表单并开始会话,设置变量:$_SESSION['login']$_SESSION['id]

然后每个需要有效登录的页面都使用require 'session.php';,它检查$_SESSION['valid'] 变量并在没有正确登录变量的情况下重定向用户。问题是当我注销时,我设置的会话变量都不会取消。

现在我的 logout.php 文件使用了几乎所有方法来销毁我已经能够在网上找到的变量,但实际上没有人会这样做。

所以每当我退出时,我仍然可以访问“私人”页面。

另请注意:我已经尝试过不带会话名称 ex:session_start();,但它不起作用,所以现在我正在使用 session_start("user");

另请注意:我没有使用 cookie。

这是我提到的文件:


登录.php


$email=$_POST['email-log']; $pass=$_POST['password-log'];

$i=-1;

do
{$i++; $path="users/".$i.".json";
$file=  file_get_contents($path);
$x=json_decode($file,true);
} while($x['email']!=$email);
$id=$i;
$truepass=$x['pass'];

$errors=0;
$hash=hash('sha256',$pass);
if($hash != $truepass){$errors=$errors+1;}

if($errors==0){
        session_start("user");
        $_SESSION['login']="valid";
        $_SESSION['id']=$id;

    header('Location: loginlanding.php');}

else{header('Location: front.php?error=y');}

session.php


session_start("user"); if($_SESSION['login'] !== "valid") {header('Location: front.php?needto=login');}

注销.php


unset($_SESSION); unset($_SESSION['login']); unset($_SESSION['id']); session_unset("user"); $_SESSION=array(); session_destroy("user"); header('Location: front.php?logged=out');

欢迎任何和所有回复,我提前感谢您,还请注意,我是一般登录的新手,因此也欢迎任何关于加强安全性的建议。我计划让它更安全,但首先我需要启动并运行这个基本功能。

【问题讨论】:

  • 这似乎很明显,但要明确一点,当有人注销时,你强迫他们去 logout.php 页面?
  • 2012 年有人自己编写这种代码有合理的理由吗?

标签: php session variables unset


【解决方案1】:

你永远不应该unset($_SESSION)

清除$_SESSION 变量的最简单方法是$_SESSION = Array();

但是,您也可以使用unset 进行迭代:

foreach(array_keys($_SESSION) as $k) unset($_SESSION[$k]);

【讨论】:

  • 啊哈!问题是在 logout.php 上我从未调用过 session_start();我不需要 session.php 在那个,所以它从来没有被调用过。现在我的 logout.php 如下:
  • 为什么要添加session_destroy("user");?它什么也没做。就做session_destroy();
【解决方案2】:

令人惊讶的是,在您取消设置 only 一开始对会话的引用之后,您尝试做的事情有多少。直接来自手册:

注意

不要使用 unset($_SESSION) 取消设置整个 $_SESSION,因为这将禁用通过 $_SESSION 超全局注册会话变量。

http://php.net/manual/en/function.session-unset.php

您正在取消设置 $_SESSION,因此您对超级全局 $_SESSION 的其他数组的取消设置没有注册,它们仍保留在浏览器的临时 cookie 中。如果您尝试删除 所有 会话变量,请改用 session_unset()。否则,不要取消设置全局会话,而是取消设置要删除的每个单独的值。

【讨论】:

    【解决方案3】:

    我的工作示例(请注意,您必须开始通话)

    <?php
        session_start();
        session_unset();
        session_destroy();
        header('location: ./');
    ?>
    

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 2017-09-12
      • 2020-03-02
      • 2016-10-01
      • 2013-02-17
      • 1970-01-01
      • 2012-04-08
      • 2013-12-25
      相关资源
      最近更新 更多