【问题标题】:Destroy session with redirect使用重定向销毁会话
【发布时间】:2015-04-23 17:01:42
【问题描述】:

当我点击注销链接时,它会重定向到一个空白页面。

这是Login.php 文件:

<?php

    session_start();
    $_SESSION['logout']= 'username';

    include_once('config.php');

    if(isset($_POST['btn'])) {
        $username = addslashes($_POST['username']);
        $password = addslashes(md5($_POST['password']));

        $query = mysqli_query($connect, "SELECT * FROM register WHERE username = '$username' AND password = '$password' ")
        or die(mysql_error());
        $result = mysqli_fetch_array($query);

        if($result['username']==$username) {
            echo "You have successfully loged in <br>";
            $check = true;
        }else {
            echo "Wrong Login or Password <br>";
        }
    }

?>

<a href="logout.php">Logout</a>

Logout.php文件:

<?php

    session_start();
    if(isset($_POST['logout'])) {
        session_destroy();
        header("Location:login.html");
        }
?>

请您更正我的代码并告诉我我做错了什么?

【问题讨论】:

  • 如果$_POST['logout']没有设置,你的代码会做什么?

标签: php session logout


【解决方案1】:

注销时的这一行

if(isset($_POST['logout'])) {

应该使用$_SESSION 而不是$_POST

根据

$_SESSION['logout']= 'username';

您还将 MySQL API 与 or die(mysql_error()) 混合使用,应该读作 or die(mysqli_error($connect))

我注意到您正在使用 MD5 存储密码;它很旧,被认为坏了。

我建议您使用CRYPT_BLOWFISH 或PHP 5.5 的password_hash() 函数。对于 PHP password_hash() compatibility pack

另外,关于您开放的 SQL injectionuse mysqli with prepared statementsPDO with prepared statements它们更安全


查看 ircmaxell 使用 password_hash() 和 PDO 和准备好的语句的解决方案:


error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告应该只在暂存阶段完成,而不是在生产阶段。

【讨论】:

  • 感谢您对我的帮助超出了我的需要
  • @Viktor 非常欢迎您。如果您觉得这已经解决了它,您可以考虑接受我的回答是正确的。这是meta.stackexchange.com/questions/5234/…然后在我的答案中以相同的方式勾选复选标记,这也通知其他人已经找到了解决方案,cheers
【解决方案2】:

问题出在您的 logout.php 文件中,您正在监听 $_POST。

if(isset($_POST['logout'])) { ...

但是,您只是使用 href 链接到注销页面

<a href="logout.php">Logout</a>

这意味着永远不会有 $_POST['logout'] 因为它不是一个表单(而是一个实际的链接)。

因此,由于它是一个链接,您只需删除 if(isset($_POST['logout'])) { .. 并执行以下操作:

<?php

session_start();
session_destroy();
header("Location:login.html");

?>

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2011-07-18
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多