【问题标题】:PHP cookies and sessions problemPHP cookie 和会话问题
【发布时间】:2010-02-14 23:48:28
【问题描述】:

如何执行一个使用 cookie 进行登录的登录脚本,例如,我想检查访问者是否在不查询数据库的情况下登录。

例如,我希望在首页上显示一些仅适用于登录用户的菜单。

所以我必须这样做 if(isLoggedIn()) 显示菜单。但这是每次页面加载时的查询,所以不是很好

有什么建议吗?

【问题讨论】:

  • 您的登录是如何设置的?他们登录网站时是否分配了SESSION 变量?有了更多信息,我们可以提供更好的答案。
  • 您必须小心获得一种对会话伪造(即某人“窃取”其他人的会话,或创建一个在您的 PHP 看来看起来是真实的会话)具有鲁棒性的解决方案。这通常不像人们最初想象的那么容易。
  • 理想情况下,我想制作一个带有登录名和密码的 cookie,这样我就可以尽可能多地使用它。但是我如何检查他是否登录而不查询mysql以检查密码或用户名是否有效?这可能吗?

标签: php cookies session


【解决方案1】:

你可以这样做:

session_start(); // 在 PHP 4.0.6 或更低版本中使用 $HTTP_SESSION_VARS if (!isset($_SESSION['loggedIn'])) { $_SESSION['loggedIn'] = true; // 添加所有相关的用户信息数据 $_SESSION['用户名'] = $用户名; $_SESSION['密码'] = $密码; $_SESSION['etc'] = $etc; }

然后您可以将用户数据请求到 $_SESSION 全局数组。 例如:请求用户是否登录(不要忘记先调用 session_start()):

函数 isLoggedIn() { 返回 (isset($_SESSION['loggedIn']) && $_SESSION['loggedIn']); }

如果你想退出:

session_destroy();

超时可以在php.ini文件中处理:

;在此秒数之后,存储的数据将被视为“垃圾”,并且 ;由垃圾收集过程清理。 session.gc_maxlifetime = 1440

或者您可以在运行时使用 ini_set 处理 ini 变量:

ini_set('session.gc_maxlifetime', $sessionMaxLifeTime);

【讨论】:

    【解决方案2】:

    您可以使用setcookie 函数创建一个cookie,并使用此函数检查cookie loggedIn 是否已设置且不为假。 :)

    function isLoggedIn() {
        return (isset($_COOKIE['loggedIn']) && $_COOKIE['loggedIn']);
    }
    

    【讨论】:

    • 是的,但它很容易被任何用户修改和破解。如果我这样做,我可以轻松地将其设置为 true 并将用户名修改为 admin,添加一个随机密码,我将以 admin 身份登录:\
    【解决方案3】:

    您可以为此使用 php 中的会话。添加 session_start();到您的页面,登录后,可能针对数据库在会话中设置一个标志。

    // user logged in sucessful
    $_SESSION['logged_in'] = true;
    

    比检查你的网页:

    if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) {
     // display menu item
    }
    

    【讨论】:

    • 是的,我想过这个,但是如果我添加这个,它会在20分钟后过期。例如,用户名和密码的 cookie 将持续 3 小时,因此我将拥有用户名和密码,但没有登录 cookie
    【解决方案4】:

    登录后立即使用http://php.net/manual/en/function.setcookie.php 设置标志,然后使用$_COOKIES 检查该标志。或者,您可以将此标志设置为 $_SESSION,然后在此处进行检查。

    【讨论】:

    • 但是cookies可以轻松修改
    【解决方案5】:

    PHP 的 $_SESSION 是基于文件的,因此如果您使用它,则不会命中 DB(尽管 DB 几乎总是比文件查找快,所以这可能不是那么有用)。

    您可以使用内存缓存,例如 memcached。

    或者,为了降低安全性,您可以存储第二个带有时间和哈希值的 cookie。当你发出它时,你连接当前时间和只有你的应用程序逻辑知道的秘密盐,然后是 md5() 或 sha1() 它。每次浏览时,您只需检查 cookie 中的时间是否在最后一小时内(或您配置的任何时间段)以及哈希是否有效。它可能会被欺骗一个小时,并且您需要通过其他方式检查合法会话,但对于基于菜单的内容可能就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多