4

抱歉重复了一个问题,我在这个论坛上看到了其中一些,但没有一个回复对我有用......

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

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

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

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

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

另请注意:我已经尝试过使用 oa 会话名称 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');}

会话.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');

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

4

3 回答 3

19

你永远不应该unset($_SESSION)

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

但是,您也可以使用以下方法进行迭代unset

foreach(array_keys($_SESSION) as $k) unset($_SESSION[$k]);
于 2012-09-06T01:34:44.213 回答
13

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

警告

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

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

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

于 2012-09-06T01:36:27.290 回答
1

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

<?php
    session_start();
    session_unset();
    session_destroy();
    header('location: ./');
?>
于 2017-12-12T17:27:59.693 回答