2012-09-06 106 views
4

对不起重复的问题,我已经看到了其中的一些在这个论坛上,但没有响应的工作对我来说...

我建立使用PHP基本登录会话,这我在新...

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

然后每个需要一个有效的登录页面使用require 'session.php';哪些检查$_SESSION['valid']变量,并重定向用户不带适当的登录变量乐。问题是,我注销时,既没有设置的会话变量也没有设置。

现在我的logout.php文件使用关于每种方法来销毁我已经能够在网上找到的变量,没有人会真正做到这一点。

因此,只要我退出,我仍然可以访问'私人'页面。

另外请注意:我已经尝试过了W/O会话名称前:我使用session_start("user");

session_start();未所以现在的工作还注意:我不使用cookie。

这里是我提到的文件:


的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'); 

任何和所有的反应是欢迎,我感谢你在前进,还要注意,我一般,所以任何建议是新来的登录加强安全性也很受欢迎。我计划让它更安全,但首先我需要启动并运行这个基本功能。

+1

它似乎很明显,但仅仅是明确的,当有人登录时,你强迫他们去logout.php页面? – Aust

+0

2012年,任何人都有自己的理由写这种代码吗? – hobbs

回答

17

你永远不应该unset($_SESSION)

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

然而,你也可以用unset迭代:

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

啊哈!问题是,在logout.php我从来没有调用session_start();我不需要session.php,所以它永远不会被调用。现在我的logout.php如下: <?php session_start(); session_unset(); session_destroy( “用户”); header('Location:front.php?logged = out'); -Works,感谢您的帮助! –

+6

为什么要添加'session_destroy(“user”);'?它什么都不做。只要做'session_destroy();' – jeremy

13

它是惊人的你尝试这么多的事后做你”已经取消了只有参考你必须在第一个会议。直接从手册:

注意

不要将已取消了整个$_SESSIONunset($_SESSION),因为这将通过$_SESSION超全局会话变量的登记。

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

你你重置$_SESSION让你取消设置的超级全球$_SESSION的其他阵列不登记,使他们仍然在浏览器中临时cookies。如果您尝试删除所有会话变量,请改用session_unset()。否则,请不要取消设置会话全局,但取消设置您要删除的每个单独的值。

1

我的工作示例(请注意,您必须将开始在电话会议上)

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