【问题标题】:PHP Cookie vs Session variablesPHP Cookie 与会话变量
【发布时间】:2012-10-29 01:05:12
【问题描述】:

我正在修改来自 php-login.net 的登录脚本并试图使其更安全。这个特定的登录脚本有一个登录类,它在用户登录时设置 cookie 和会话变量。

/**
 *  write user data into PHP SESSION [a file on your server]
 */
   $_SESSION['user_name'] = $result_row->user_name;
   $_SESSION['user_email'] = $result_row->user_email;
   $_SESSION['user_logged_in'] = 1;

/**
 *  write user data into COOKIE [a file in user's browser]
 */
   setcookie("user_name", $result_row->user_name, time() + (3600*24*100));
   setcookie("user_email", $result_row->user_email, time() + (3600*24*100));
   $this->user_is_logged_in = true;

不幸的是,在用户可以访问的页面上,没有人写检查以确保用户在访问该页面时已登录。因此,如果一个人只是直接输入 URL,他们就不必登录。

我想知道验证用户是否登录的最佳方式。目前我正在使用这个,但我不知道它是否是多余的(意思是:cookie变量总是等于会话变量,所以没有检查两者都有点?)任何输入都会有帮助。

session_start();
if(!(isset($_COOKIE['user_email']) && 
    isset($_SESSION['user_email']) &&
    ($_COOKIE['user_email']===$_SESSION['user_email']) &&
    isset($_COOKIE['user_name']) && 
    isset($_SESSION['user_name']) && 
    ($_COOKIE['user_name']===$_SESSION['user_name']) && 
    isset($login) && 
    $login->isUserLoggedIn())){
        header("location:../../index.php");
        exit;
     }

(抱歉,代码格式不正确,我仍在尝试找出本网站上文本格式的细微差别)

【问题讨论】:

  • 哇。从头开始。
  • 伟大的斯科特!我同意@Relentless。但是,如果需要继续使用预先存在的代码,我建议只检查 Session。废弃 cookie。
  • 是的,cookie是多余的,客户端已经有一个cookie指向服务器端会话变量。
  • 第二。放弃 cookie 并专注于更好的会话管理/课程。
  • 听起来不错,扔饼干。谢谢您的帮助。 @PenguinCoder/@relentless,不幸的是,从头开始不是这个选项。抱怨,抱怨。

标签: php session cookies session-variables


【解决方案1】:

当使用会话时,已经存在一个带有会话 ID 的 cookie,它映射到服务器端 php 会话。您在那里注册的所有数据都将在全局 $_SESSION 数组中可用。将数据存储在 cookie 和服务器上通常是没有意义的。

您将数据存储在 cookie 中的唯一原因是,如果您在同一个域名上有更多站点需要共享 cookie 数据。

【讨论】:

  • 因此,即使您希望您的用户在几次系统重新启动后几天/几周后登录,也不需要向 cookie 提交数据?我们是否需要将session_set_cookie_params($cookieParams["lifetime"] 设置为某个值以保证它一直存在,直到客户端清除浏览器历史记录?基本上问题是,我如何让客户的浏览器在他回来时记住我的网站和他的登录状态?
  • 那么会话 cookie 的生命周期是基于 2 个 tihngs。一部分是客户端cookie,另一部分是在php.ini 文件中设置的会话生命周期和垃圾回收生命周期。如果您想要较长的会话持续时间,则两者都需要设置为高。
  • 我昨天实际上了解到,关于垃圾收集器和更改 ini 文件中的参数...我有这样的设置...只需要留意会话所在的文件夹看看会发生什么并避免在其中存储太多信息......如果它开始变得过于混乱,我已经找到了使用令牌和数据库检查的解决方法。虽然我不会用它来登录任何人,但可能只是填写一些表单字段。感谢您的帮助^^
  • 顺便说一下,当子域中有更多站点时,您可以轻松地将会话 cookie 域设置为 .domain.com,它们会为每个子域提供服务。至少从我浏览的文档中我是这么认为的 => php.net/manual/en/function.session-set-cookie-params.php#94961
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 2011-09-23
  • 2014-10-14
  • 1970-01-01
  • 2011-04-16
  • 2012-08-21
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多