【问题标题】:Creating cookies in php在 php 中创建 cookie
【发布时间】:2012-01-12 04:28:36
【问题描述】:

我正在尝试从PHPNerds 学习如何使用 cookie。我在运行他们提到的脚本时遇到了麻烦(我几乎了解代码的作用,但我无法获得将使用哪个名称存储哪些代码)。它们如下,

用户登录

<html>
<head>
<title>User Logon</title>
</head>
<body>
  <h2>User Login </h2>
  <form name="login" method="post" action="login.php">
   Username: <input type="text" name="username"><br>
   Password: <input type="password" name="password"><br>
   Remember Me: <input type="checkbox" name="rememberme" value="1"><br>
   <input type="submit" name="submit" value="Login!">
  </form>
</body>
</html>

登录代码

<?php
/* These are our valid username and passwords */
$user = 'jonny4';
$pass = 'delafoo';

if (isset($_POST['username']) && isset($_POST['password')) {

    if (($_POST['username'] == $user) && ($_POST['password'] == $pass)) {    

        if (isset($_POST['rememberme'])) {
            /* Set cookie to last 1 year */
            setcookie('username', $_POST['username'], time()+60*60*24*365, '/account', 'www.example.com');
            setcookie('password', md5($_POST['password']), time()+60*60*24*365, '/account', 'www.example.com');

        } else {
            /* Cookie expires when browser closes */
            setcookie('username', $_POST['username'], false, '/account', 'www.example.com');
            setcookie('password', md5($_POST['password']), false, '/account', 'www.example.com');
        }
        header('Location: index.php');

    } else {
        echo 'Username/Password Invalid';
    }

} else {
    echo 'You must supply a username and password.';
}
?>

验证

<?php
/* These are our valid username and passwords */
$user = 'jonny4';
$pass = 'delafoo';

if (isset($_COOKIE[['username']) && isset($_COOKIE['password')) {

    if (($_POST['username'] != $user) || ($_POST['password'] != md5($pass))) {    
        header('Location: login.html');
    } else {
        echo 'Welcome back ' . $_COOKIE['username'];
    }

} else {
    header('Location: login.html');
}
?>

提前致谢。

【问题讨论】:

  • 只是一个警告:不要在任何类型的生产中使用它。存储密码(甚至使用 MD5 散列)是不安全和不负责任的。话虽如此,这是一个很好的练习例子。
  • 我认为你从坏例子中学习 cookie,将用户名和密码存储在 cookie 中是危险的坏习惯。

标签: php cookies setcookie remember-me


【解决方案1】:

好的,我现在明白了,

PHP 很灵活。您可以将您的 html 与您的逻辑分开,也可以在一页中提供所有内容。你会得到关于什么是“正确”的处理方式的争论,但最终这与你自己的偏好以及你计划在未来如何处理代码有关。

就个人而言,在一个小项目中,我会将登录页面的逻辑和 html 放在一个文件中...

login.php:

<?php
/* These are our valid username and passwords */
$user = 'jonny4';
$pass = 'delafoo';
$error = null;

if (isset($_POST['username']) && isset($_POST['password')) {

    if (($_POST['username'] == $user) && ($_POST['password'] == $pass)) {    

        if (isset($_POST['rememberme'])) {
            /* Set cookie to last 1 year */
            setcookie('username', $_POST['username'], time()+60*60*24*365, '/account', 'www.example.com');
            setcookie('password', md5($_POST['password']), time()+60*60*24*365, '/account', 'www.example.com');

        } else {
            /* Cookie expires when browser closes */
            setcookie('username', $_POST['username'], false, '/account', 'www.example.com');
            setcookie('password', md5($_POST['password']), false, '/account', 'www.example.com');
        }
        header('Location: index.php');
        exit;
    } else {
        $error = 'Username/Password Invalid';
    }

} else {
    $error = 'You must supply a username and password.';
}
?>
<html>
<head>
<title>User Logon</title>
</head>
<body>
  <h2>User Login </h2>
  <?php echo $error ? $error.'<br>' : ''; ?>
  <form name="login" method="post" action="login.php">
   Username: <input type="text" name="username"><br>
   Password: <input type="password" name="password"><br>
   Remember Me: <input type="checkbox" name="rememberme" value="1"><br>
   <input type="submit" name="submit" value="Login!">
  </form>
</body>
</html>

index.php:

<?php
/* These are our valid username and passwords */
$user = 'jonny4';
$pass = 'delafoo';

if (isset($_COOKIE[['username']) && isset($_COOKIE['password')) {

    if (($_POST['username'] != $user) || ($_POST['password'] != md5($pass))) {    
        header('Location: login.php');
        exit;
    } else {
        echo 'Welcome back ' . $_COOKIE['username'];
    }

} else {
    header('Location: login.php');
    exit;
}
?>

如果你是认真的,我会研究MVC(模型视图控制器)和 OOP(面向对象编程),看看它有多合适。但是对于基本的事情,在这个例子中的视图顶部处理登录并没有什么特别的问题。

从我的角度来看——为一家网络公司工作——当我从一个新客户那里继承一个项目并且老程序员将他们可能的所有东西都分离到一个新文件中时,我绝对讨厌它。术语“适合工作的工具”也适用于项目的基本方法。在某些情况下,一个站点是如此之小,以至于通过一个框架来处理它或建立一个复杂的文件系统会浪费大量时间。这一切都取决于您的需求,这将随着经验而变得清晰。

有一点是肯定的 - 每个人都说在 cookie 中存储用户名和密码是一个坏主意,这是绝对正确的。通常你会做一些事情,比如存储一个唯一的 ID 并与数据库交叉引用以提取相关的用户信息。这样一来,任何新手黑客或白痴都不会在桌面上打开 cookie 来劫持您的数据。

【讨论】:

  • 我的意思是文件名。所有三个代码示例都在单独的文件中,对吧?
【解决方案2】:

在验证页面时可能是拼写错误,并将值与 cookie 而不是 POST 超全局变量进行比较。

if (isset($_COOKIE['username'],$_COOKIE['password'])) {

    if ($_COOKIE['username'] == $user && $_COOKIE['password'] == md5($pass)) {    
        echo 'Welcome back ' . $_COOKIE['username'];
    } else {
         header('Location: login.html');        
    }
} else {
    header('Location: login.html');
}

【讨论】:

    【解决方案3】:

    这是另一种方法,试试这个。

    <?php
    /* These are our valid username and passwords */
    $user = 'jonny4';
    $pass = 'delafoo';
    
    if (isset($_COOKIE[['username']) && isset($_COOKIE['password')) {
    
       if (($_POST['username'] != $user) || ($_POST['password'] != md5($pass))) {    
        header('Location: login.php');
        exit;
       } else {
        echo 'Welcome back ' . $_COOKIE['username'];
      }
    
     } else {
       header('Location: login.php');
       exit;
       }
      ?>
    

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 2021-04-05
      相关资源
      最近更新 更多