【问题标题】:PHP User Authentication with Sessions带有会话的 PHP 用户身份验证
【发布时间】:2013-02-14 18:30:58
【问题描述】:

所以我的问题非常基本。

当检查用户是否仍在任何页面上登录时,我将使用

if (isset($_SESSION['user']) && $_SESSION['user'] == true) { CODE }

但是,我不应该为 $_SESSION['user'] 使用散列值而不是布尔值吗? 我找到的所有指南都使用布尔值,但从我的角度来看,这是一个安全漏洞,不是吗?人们一直在谈论 Session-Hjacking 和 Session-Fixation,如果我只是为用户会话使用布尔值,那将非常容易,不是吗?还是我只是在这里混在一起?

谢谢

【问题讨论】:

  • 劫持会话不会以某种方式让您访问会话数据。数据仍然完好无损(除非您允许用户更改)。
  • 为什么? $_SESSION 数据仅存在于服务器上,用户不能直接访问/操作,除非您的代码允许他们这样做。
  • 但是劫持使您可以访问会话访问的数据。那么我对这些类型的会话与 PHPSESSID 不同吗?
  • @JustBasti 您仍然对服务器端和客户端感到困惑。自己试试吧。启动会话并查看存储在浏览器中的会话 cookie,名为 PHPSESSID。它只是一个 32 位的十六进制字符串。这就是劫持者获得的所有信息,除非您的程序向他们透露更多信息,因为他们基本上将以原始用户身份登录。
  • @BackinaFlash 为最坏的情况做准备绝不是的事情。有人可能会入侵任何特定的服务器吗?不,但这是可能的。安全总比后悔好。

标签: php security authentication


【解决方案1】:

我在这里读了两个问题。第一个问题“确定用户是否登录的最佳做法是什么?”和第二个问题“是否存在会话劫持和会话固定问题?”

第一个问题: 我使用过的大多数网络应用程序/cms 都有一个用户对象。从代码的角度来看,这个对象并没有什么特别之处,它只是一个代表用户的对象。当前登录的用户将其用户对象存储在会话中。 $_SESSION['user']

在 Drupal(和其他平台)中,a 函数用于返回当前登录的用户,如果用户未登录,则返回 False。

例子:

function user(){
 if( isset($_SESSION['user') and 
     is_object($_SESSION['user'] and 
     get_class($_SESSION['user']=='myUserClass')) ){

         return $_SESSION['user'];

     }else{
         return False;
      }
}

因此,在您的示例中,我们看到 if ( user() ) { CODE } 有效,因为在 if 子句中所有对象都评估为 True。

第二个问题: Session-Hjacking 和 Session-Fixation 并不是真正的问题。客户端(Web 浏览器)无权访问服务器的 $_SESSION 数组。简而言之,是的,您在这里混淆了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-07-15
    • 2010-12-02
    相关资源
    最近更新 更多