使用cookie进行简单的PHP登录

时间:2010-12-01 22:29:38

标签: php

我已经开始开发这个非常简单的PHP登录,要求输入密码才能访问网站。它还会创建一个cookie,以便在用户关闭浏览器窗口之前继续访问。

在每个页面的顶部,我检查cookie:

<?php

    if(!isset($_COOKIE['authorised']) || ($_COOKIE['authorised'] != 'true'))
    {
        include('login.php'); exit;
    }

?>

如果他们没有,那么我退出并显示登录表单:

<?php

    function pageURL()
    {
        $pageURL = 'http';
        if ($_SERVER["HTTPS"] == "on")
        {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80")
        {
            $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        } 
        else
        {
            $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $pageURL;
    }

    $pageRedirect = pageURL();

    if(isset($_POST['password']) && ($_POST['password'] == 'qwe123'))
    {
        setcookie('authorised', 'true'); header("Location:$pageRedirect",303);
    }
    else
    {
        include('noaccess.php'); exit;
    }

?>
<form action="<?php echo pageURL(); ?>" method="post">
<input type="password" name="password" />
                <input type="submit" title="I agree" value="I agree" name="submit" />
            </form>

当您必须同意访问该网站时,当前的PHP来自旧的警告页面,我想修改它以使用简单的表单,以便如果用户输入密码,例如'qwe123',那么他们创建然后将cookie重定向回页面,但现在可以访问cookie了。如果他们弄错了,那么包含并退出另一页。

有人可以帮我吗?感谢

2 个答案:

答案 0 :(得分:10)

请不要尝试在客户端cookie中存储“已验证”之类的内容;那令人难以置信的不安全感。用户可以修改cookie中的任何内容 - 因此在这种情况下,我可以在浏览器设置中查找cookie,然后编辑它以将“authenticated”设置为true。我会在没有用户名或密码的情况下登录。

查看PHP's session management个功能。您应该创建一个会话并存储任何安全的信息服务器端,而不是客户端。

使用会话的示例如下:

<?php
session_start();

$secretpassword = 'qwert1234';
$secretusername = 'foobar';

if ($_SESSION['authenticated'] == true) {
   // Go somewhere secure
   header('Location: secure.php');
} else {
   $error = null;
   if (!empty($_POST)) {
       $username = empty($_POST['username']) ? null : $_POST['username'];
       $password = empty($_POST['password']) ? null : $_POST['password'];

       if ($username == $secretusername && $password == $secretpassword) {
           $_SESSION['authenticated'] = true;
           // Redirect to your secure location
           header('Location: secure.php');
           return;
       } else {
           $error = 'Incorrect username or password';
       }
   }
   // Create a login form or something
   echo $error;
   ?>
<form action="login.php"><input type="text" name="username" /><input type="text" name="password" /><input type="submit" value="login" /></form>
<?php
}

这是一个非常丑陋的例子,但这涵盖了它的内容

  • 如果用户已经登录,请执行安全操作(当然,secure.php脚本还应验证用户是否已登录)
  • 如果用户未登录,但他们已提交表单,请检查其详细信息
    • 如果用户名/密码不正确,请设置错误消息
    • 如果用户名/密码正确,请将其发送到安全的地方
  • 显示错误消息(如果已设置
  • 显示登录表单

在发送任何其他输出之前运行session_start();这会在客户端存储会话cookie,该cookie仅在客户端存储标识号。所有其他数据都存储在服务器端,因此用户无法修改。

您可以在此设置几个参数来提高安全性,包括httponly(防止通过javascript访问cookie,帮助抵御XSS攻击)和安全(仅通过SSL传输cookie)。如果可能,应该启用这些。

答案 1 :(得分:0)

只需将表单提交到您检查密码的页面,它就可以正常工作。

但是,您可能需要将$_SERVER["REQUEST_URI"];更改为更具体的页面,因为这只是您当前所在的页面(表单提交的页面)。