对不起重复的问题,我在这个论坛上看过其中一些,但没有一个回复对我有用......
我正在使用php会话构建基本登录,我是新来的......
login.php验证html登录表单并开始会话,设置变量:$_SESSION['login']
和$_SESSION['id]
,
然后每个需要有效登录的页面使用require 'session.php';
来检查$_SESSION['valid']
变量并重定向没有正确登录变量的用户。问题是当我注销时,我设置的会话变量都不会被设置。
现在我的logout.php文件使用大约每个方法来销毁我在网上找到的变量,但实际上没有人会这样做。
因此,每当我退出时,我仍然可以访问“私人”页面。
另请注意:我已经尝试过没有会话名称ex:session_start();
但是没有用,所以现在我正在使用session_start("user");
另请注意:我不使用cookies。
以下是我提到的文件:
的login.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');}
logout.php
unset($_SESSION); unset($_SESSION['login']); unset($_SESSION['id']); session_unset("user"); $_SESSION=array(); session_destroy("user"); header('Location: front.php?logged=out');
欢迎任何和所有回复,我提前感谢你,同时注意,我是一般新登录的人,所以欢迎任何加强安全的建议。我打算让它更安全,但首先我需要启动并运行这个基本功能。
答案 0 :(得分:18)
你永远不应该unset($_SESSION)
。
清除$_SESSION
变量的最简单方法是$_SESSION = Array();
但是,您也可以使用unset
进行迭代:
foreach(array_keys($_SESSION) as $k) unset($_SESSION[$k]);
答案 1 :(得分:13)
令人惊讶的是,在您之后,您尝试做了多少事情,而您首先取消了对会话的唯一引用。直接来自手册:
<强>注意强>
请勿使用
unset($_SESSION)
取消整个$_SESSION
,因为这会禁用通过$_SESSION
超全局注册会话变量。
您未设置$_SESSION
,因此您对超级全局$_SESSION
的其他数组的取消设置未注册,而是将它们保留在浏览器临时Cookie中。如果您尝试删除所有会话变量,请使用session_unset()
。否则,请不要取消设置会话全局,但取消设置要删除的每个值。
答案 2 :(得分:1)
我的工作示例(注意你必须开始通话)
<?php
session_start();
session_unset();
session_destroy();
header('location: ./');
?>