PHP Cookie与Session变量的区别

3
我正在修改 php-login.net 的登录脚本,并试图使其更加安全。这个特定的登录脚本有一个登录类,当用户登录时设置了cookie和session变量。
/**
 *  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变量,所以检查两者是否都有意义吗?)任何意见都会有所帮助。
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;
     }

对不起,代码格式可能有些混乱,我还在努力弄清楚这个网站的文本格式细节。


5
哇,从头开始。 - Paul Dessert
太棒了!我同意@Relentless的观点。但是,如果需要继续使用现有的代码,我建议仅检查会话。放弃cookie。 - PenguinCoder
4
是的,这个 Cookie 是多余的,因为客户端已经有一个指向服务器端会话变量的 Cookie。 - Delta
赞同。只需放弃 cookie,集中精力于更好的会话管理/类。 - nickhar
好的,清除 cookies。感谢您的帮助。@PenguinCoder/@relentless,不幸的是,从头开始并不是这个问题的选择。咕哝,咕哝。 - Scott
1个回答

2
当使用会话时,已经存在一个带有会话ID的cookie,该ID映射到服务器端的PHP会话。您在那里注册的所有数据将在全局$ _SESSION数组中可用。在cookie以及服务器上存储数据通常是没有意义的。只有当您有多个站点共享cookie数据时,才会将数据存储在cookie中。

那么,即使您希望用户在几天/几周后的几次系统重启后仍然登录,也没有必要将数据提交到cookie中吗?我们需要将session_set_cookie_params($cookieParams["lifetime"]设置为特定值以保证它一直存在,直到客户端清除浏览器历史记录吗?基本上问题是,我如何让客户端的浏览器在他回来时记住我的网站和他的登录状态? - Fernando Silva
1
会话 cookie 的生存期基于两个因素。一个部分是客户端 cookie,另一个是会话生存期和垃圾回收生存期,这些都在 php.ini 文件中设置。如果您想要长时间的会话持续时间,两者都需要设置得很高。 - Damien Overeem
我昨天刚学到关于垃圾回收器和更改ini文件中的参数的知识...我的设置就是这样...只需要密切关注会话存储目录的情况,避免在其中存储过多信息...如果它开始变得混乱,我已经找到了一个使用令牌和数据库检查的解决方法。虽然我不会用它来登录任何人,但可能只是填写一些表单字段。感谢您的帮助^^ - Fernando Silva
顺便说一下,如果在子域中有更多的站点,您可以轻松地将会话cookie域设置为.domain.com,它们将为每个子域提供服务。至少我从我查阅的文档中是这样认为的 => http://www.php.net/manual/en/function.session-set-cookie-params.php#94961 - Fernando Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接