php - 使用 cookie 的简单 PHP 登录

标签 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 而可以访问。如果他们弄错了,则会包含并退出另一个页面。

有人可以帮我解决这个问题吗?谢谢

最佳答案

请不要尝试在客户端 cookie 中存储诸如“已验证”之类的内容;那是非常不安全的。用户可以修改 cookie 中的任何内容——所以在这种情况下,我可以在浏览器设置中查找 cookie,然后编辑它以将“已验证”设置为 true。然后我将登录,无需用户名或密码。

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

使用 session 的示例如下;

<?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();这在客户端存储一个 session cookie,它只在客户端存储一个标识号。所有其他数据都存储在服务器端,因此用户无法修改。

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

关于php - 使用 cookie 的简单 PHP 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4329806/

相关文章:

php - Codeception:测试组的哪些组合是可能的?

php - 如何使用预先存在的源代码为 php 开发设置 eclipse ide

php - 在 PHP 中如何确定某物是数组还是对象?

php - 如何根据相同的类而不是相同的名称对单选按钮进行分组

php - 如何获取 : Time Zone Setting of FTP Server?

php - 如何在彼此相邻的两个单选按钮之间添加间距

php - Stream_get_contents 第二次不起作用?

php - 用于多重隐私检查的嵌套 MySQL 查询

PHP Reddit 排名算法 - 计算排名

javascript - Google Analytics - 调整后的跳出率没有太多数据