每当我运行logout.php脚本,然后返回到一个没有登录保护的页面,它将让我仍然登录
logout.php
<?php
session_start();
session_unset();
session_destroy();
header("Location: ../index.php");
exit();
?>
的login.php
$userlogin = user_login($email, $password.$salt);
if ($userlogin==false){
$errors[]='Wrong email/password combination.';
} else {
//set the user session
$_SESSION['UserId']=$userlogin;
$_SESSION['LoginIP']=$_SERVER['REMOTE_ADDR'];
$db->query("UPDATE users SET ipadd='".$_SERVER['REMOTE_ADDR']."' WHERE user_id=".$_SESSION['UserId']."");
echo '<meta http-equiv="refresh" content="0; URL=index.php">';
检查已登录的代码段
/* Check if user is logged in or not */
function loggedin(){
return (isset($_SESSION['UserId'])) ? true : false;
}
if (loggedin()==true){
$session_user_id = $_SESSION['UserId'];
$user_data = user_data($session_user_id,'full_name','username');
$rezult =$db->query("SELECT ipadd FROM users WHERE user_id=".$_SESSION['UserId']."");
while($rez = $rezult->fetch_assoc()){
if ($rez['ipadd']==$_SERVER['REMOTE_ADDR']) {
} else {
echo '<meta http-equiv="refresh" content="0; URL=logout2.php">';
}
}
}
看过同样问题的帖子,但无论我尝试什么仍然得到同样的问题。任何建议都将非常感谢!
答案 0 :(得分:1)
这是来自php.net http://php.net/manual/en/function.session-destroy.php 注意:您不必从通常的代码调用session_destroy()。清理$ _SESSION数组而不是销毁会话数据。
所以你只需要$ _SESSION = null,并且应该注销。
答案 1 :(得分:0)
我认为在你的index.php文件中应该有这些行:
if(!isset($_SESSION["session_name"])){
header("Location: somewhere_mainpage.php");
}
最好让所有页面都有这些行。如果没有会话开始,这些行将把标题发送到另一个页面。
答案 2 :(得分:0)
<?php
session_unset();
session_destroy();
header("Location: ../index.php");
?>
应该可以使用,否则你可以取消设置值
<?php
unset($_SESSION['UserId']); // Unsets the UserId Variable reuse for each variable
session_destroy();
header("Location: ../index.php");
?>
你尝试过session_destroy()吗?
我也不确定你在关闭会话时是否需要session_start(),从内存中你只需要它来启动会话
答案 3 :(得分:0)
我相信当用户登录数据正确时,session_start();
函数调用应该在您的登录页面上,并且在您的注销PHP代码中,您应该设置
session_destroy();
或unset($_SESSION['UserId'];
Logout.php:
<?php
session_destroy();
/* * OR * */
//unset($_SESSION['UserId'];
header("Location: ../index.php");
exit();
?>
答案 4 :(得分:-1)
我总是想破坏服务器会话和客户端cookie,尝试在出现任何错误时手动覆盖所有选项。
您可以使用以下命令破坏PHP中的cookie:
Vertex | value | type_undir_1_any | type_undir_2_any
Alice | 1 | 0.2 | 0
setcookie(session_name(), '', time() - 3600, $cookie_path, $cookie_domain, $cookie_secure, $cookie_httponly );
<?php
$cookie_path = "...";
$cookie_domain = "...";
$cookie_secure = "...";
$cookie_httponly = "...";
session_start();
session_unset();
session_destroy();
setcookie(session_name(), '', time() - 3600, $cookie_path, $cookie_domain,$cookie_secure, $cookie_httponly );
header("Location: ../index.php");
exit();
使cookie在当前时间之前到期,这使得它无效。
调查的另一个选项是您的退出页面上的time() - 3600
。一些参考页面如下: