【问题标题】:Using PHP to logout of a site where a Cookie was set使用 PHP 注销设置了 Cookie 的站点
【发布时间】:2023-03-15 07:41:01
【问题描述】:

很难弄清楚这一点。我知道将此信息存储在 cookie 中不是最佳做法,但这是针对学校项目的,而我的教授只是要求这样做。

这是您登录并设置 cookie 的代码 | admin.php:

'

<?php
if (!isset($_COOKIE['loggedIn'])) {
  if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
  } else if($_SERVER['PHP_AUTH_USER'] == "user1" &&
    $_SERVER['PHP_AUTH_PW'] == "pass1") {
    //make the cookie
    setcookie("loggedIn", "user1/pass1", time() + 60);
  } else {
    header('HTTP/1.0 401 Unauthorized');
    echo "Invalid Credentials";
    exit;
  }
} else {
  if (isset($_COOKIE['loggedIn']) && $_COOKIE['loggedIn'] == "user1/pass1") {
   //YAY DO NOTHING ITS ME
  } else {
    header('HTTP/1.0 401 Unauthorized');
    echo "Invalid Credentials";
    exit;
  }
}
?>

'

这是我试图运行以删除 cookie 和注销的代码,因此当您再次访问 admin.php 页面时,您将不得不再次输入凭据......但它似乎不起作用。
注销.php:

'

<?php 

    if(isset($_COOKIE[session_name()])):
            setcookie(session_name(), '', time()-7000000, '/');
        endif;

    if(isset($_COOKIE['loggedIn'])):
        setcookie('loggedIn', '', time()-7000000, '/');
    endif;

    session_start();
    session_unset();
    //unset($_SESSION["nome"]);  
    // where $_SESSION["nome"] is your own variable. if you do not have one use only this as follow **session_unset();**
    header("Location: index.php");

 ?>

'

提前感谢您的帮助!

【问题讨论】:

  • 不要使用 session_unset()。它是 session_register() 的补充,已经被弃用了很长时间。无论如何,它只有在您实际使用 session_register 时才有用。如果您想清除会话,$_SESSION = array() 将为您完成。
  • 我用$_SESSION = array() 代替session_unset(); 吗?
  • @MarcB 我试过这样做,我仍然可以点击我的管理页面并自动登录。
  • 执行 shift-F5 “强制重新加载”。您很可能只是在查看缓存页面。
  • @MarcB 我强制重新加载,并尝试手动清空我的浏览器缓存.. 仍然自动登录。:(

标签: php authentication cookies admin logout


【解决方案1】:

php.net 上有一个非常全面的示例:http://php.net/manual/en/function.session-destroy.php

<?php
session_start();

// Unset all of the session variables.
$_SESSION = array();

if(isset($_COOKIE[session_name()])):
    setcookie(session_name(), '', time()-7000000, '/');
endif;

if(isset($_COOKIE['loggedIn'])):
    setcookie('loggedIn', '', time()-7000000, '/');
endif;

// Check session cookies
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}

// Finally, destroy the session.
session_destroy();
//session_unset();
//unset($_SESSION["nome"]);  
// where $_SESSION["nome"] is your own variable. if you do not have one use only this as follow **session_unset();**
header("Location: index.php");

注意取消设置会话数组:$_SESSION = array();删除会话 cookie;并销毁会话: session_destroy();

谢谢,

安德鲁

【讨论】:

  • 我使用了你回答的代码,我仍然无法让我再次登录.. 它直接进入管理页面。
  • 取消设置会话并返回管理页面后,此语句是否返回 true 并重新登录:else if($_SERVER['PHP_AUTH_USER'] == "user1" && $_SERVER ['PHP_AUTH_PW'] == "pass1") { //制作 cookie setcookie("loggedIn", "user1/pass1", time() + 60); }
猜你喜欢
  • 2020-02-07
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2015-01-01
  • 2012-02-19
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多