PHP取消设置会话和cookie

时间:2015-09-07 23:51:26

标签: php session cookies

我是编程新手,我正在使用PHP。我收到了一个名为login.php的文件和一些指示来创建名为admin.php的第二个文件。

以下是说明。

  

admin.php

     
      
  • 如果用户尝试在不登录的情况下访问此文件,请将其重定向到login.php页面,该页面应显示“无效登录”消息 - 使用会话变量进行检查。

  •   
  • 如果他们已登录:

         
        
    • 向他们提供“loggedIn”cookie的值,并带有以下消息:“您在1月25日上午10:00登录”(或无论值是什么)

    •   
    • 取消设置会话变量并销毁会话并

    •   
    • 取消设置两个Cookie(会话和'loggedIn')并设置为过期,以便浏览器将其删除。

    •   
    • 注意:在添加代码以破坏会话和cookie之前,测试login.php的已登录部分。

    •   
  •   
     

完成上述工作后,请更改代码,以便在从admin.php重定向到login.php时,它应显示不同的消息:“您需要登录”。

<?php
    session_start();
    $message = null;

    if (isset($_SESSION['loggedIn']) && $_SESSION['loggedIn'] == 'true') {
        header("Location: admin.php");
        exit();
    }

    if ( $_SERVER['REQUEST_METHOD'] == 'GET') {
        if ( sizeof($_GET) && isset($_GET['username']) && isset($_GET['password']) && $_GET['username'] && $_GET['password']) {
            if ($_GET['username'] == 'username' && $_GET['password'] == 'password') {
                $_SESSION['loggedIn'] = 'true';
                setcookie ("loggedIn", date("F d,Y h:ia"),  time()+60*10, "/", $_SERVER['SERVER_NAME']);
                header("Location: admin.php");
                exit();
            } else {
                $message = 'Invalid Login';
            }
        } else {
            $message = 'Invalid Login';
        }
    }

?>
<!DOCTYPE HTML>
<html>
    <head>
        <title>Login</title>
    </head>
    <body>
        <?php if($message) echo '<div class="warning">' . $message .       '</div>'; ?>
        <form method="get">
            <label for="username">Username</label>
            <input type="text" name="username" id="username" value="username" />
            <label for="password">Password</label>
            <input type="password" name="password" id="password"  value="password" />
            <input type="submit" name="submit" value="Login" />
        </form>
    </body>
</html>

以下代码是我到目前为止所有的代码。我想知道我的unsetting是否与会话变量和cookie一致。另外,如何显示说明中所述的日期和时间,以及如何显示“如果用户从admin.php页面定向到login.php页面则需要登录?”的消息? p>

<?php
session_start();

if (!isset($_SESSION['loggedIn']) && $_SESSION['loggedIn'] == 'false') {
        header("Location: login.php");
        exit();
    } else {
        unset($_SESSION['loggedIn']);
        session_unset();
        session_destroy();
        unset($_COOKIE['loggedIn']);
    }
?>

3 个答案:

答案 0 :(得分:0)

我认为我完全支持你的要求。如果不对,请告诉我。

首先是消息,我会通过将其重定向到GET URL来实现 所以也许http://example.com/login.php?login=error或类似的东西。

那么你会说

if($_GET['login'] == 'error') {
    echo '<h1>You Need to login</h1>';
}

现在我会查看w3 school的日期和时间,以便找到您想要的格式。如果你仍然无法弄清楚,请告诉我。

最后,对于未设置的cookie,您应该将cookie设置为空。所以setcookie(“用户名”,“”)

答案 1 :(得分:0)

您正在使用似乎执行类似任务的SESSION变量和COOKIE变量的混合。您应该拥有SESSION变量中的所有内容,然后当您想要注销用户时,您只需要调用session_destory

此外,您正在使用$_GET变量登录,这可能会导致安全问题,因为变量将在URL中可见,这意味着任何查看该人员计算机历史记录的人都能够以明文方式查看其密码在URL中。您应该切换到使用$_POST

答案 2 :(得分:0)

那里你有一个错误:

!isset($_SESSION['loggedIn']) && $_SESSION['loggedIn'] == 'false'

总是被false所吸引:

$array = [];

$a1 = !isset($array['loggedIn']) && @$array['loggedIn'] == 'false';

$array = ['loggedIn' => 'false'];

$a2 = !isset($array['loggedIn']) && @$array['loggedIn'] == 'false';

$array = ['loggedIn' => 'true'];

$a3 = !isset($array['loggedIn']) && @$array['loggedIn'] == 'false';

var_dump([$a1, $a2, $a3]);

// array(3) {
//   [0]=>
//   bool(false)
//   [1]=>
//   bool(false)
//   [2]=>
//   bool(false)
// }

更好地利用这个:

!(isset($array['loggedIn']) && @$array['loggedIn'] != 'false')

结果:

$array = [];

$a1 = !(isset($array['loggedIn']) && @$array['loggedIn'] != 'false');

$array = ['loggedIn' => 'false'];

$a2 = !(isset($array['loggedIn']) && @$array['loggedIn'] != 'false');

$array = ['loggedIn' => 'true'];

$a3 = !(isset($array['loggedIn']) && @$array['loggedIn'] != 'false');

var_dump([$a1, $a2, $a3]);

// array(3) {
//   [0]=>
//   bool(true)
//   [1]=>
//   bool(true)
//   [2]=>
//   bool(false)
// }