【问题标题】:Are sessions modifiable by the client/user?客户端/用户是否可以修改会话?
【发布时间】:2011-02-24 22:16:39
【问题描述】:

在我的 PHP Web-App 中,我使用会话来存储用户的数据。例如,如果用户登录,则会生成 User 类的实例并将其存储在 Session 中。

我有与每个用户相关联的访问级别以确定他们的权限。

通过以下方式将用户存储在会话中:

$_SESSION['currentUser'] = new User($_POST['username']);

例如:

if($_SESSION['currentUser'] -> getAccessLevel() == 1)
{
  //allow administration functions
}

其中 getAccessLevel() 只是 User 类中的一个 get 方法,它返回 _accesslevel 成员变量。

这安全吗?或者客户端可以通过某种会话操作以某种方式修改其访问级别?

【问题讨论】:

    标签: php security session


    【解决方案1】:

    不,客户不能修改他们的访问级别。唯一存储在客户端上的是会话密钥,它可以通过 cookie 或 GET 参数传播。会话密钥与相应的会话记录相关联,该会话记录是存储在服务器端(通常在临时目录中)的文件,其中包含“punch”。 您不想要的是会话密钥泄露给第三方:

    泄露的会话 ID 会启用第三个 访问所有资源的一方 与特定的 id 相关联。

    看看这个:http://www.php.net/manual/en/session.security.php

    【讨论】:

    • 它会如何泄漏,假设我没有在查询字符串中传递 session_id 也没有通过 post (除非它自动发生但我不知道这样的事情),并假设他们没有'无法访问服务器?
    • @Sev - 您的网络流量可以被嗅探。除非您使用 SSL,否则 Cookies/Get Parameters/Whatever 都是纯文本且易于提取。
    【解决方案2】:

    会话信息存储在服务器上,用户只能访问密钥。在实践中,我使用了这种东西,还有额外的步骤。在验证用户详细信息并存储用户对象后,我会在查看任何受保护的页面时运行一个查询,以验证会话中的内容是否与他们试图查看的内容一致。 在您 page.php 的顶部

    if(!validUser($user)){ 
       // Relocate the user
    }
    

    在哪里

    validUser(User $user)
    {
       // Some query to verify the information in the session
       // Return the results of verification
    }
    

    【讨论】:

    • 基本上你说的是查询数据库并确保数据与会话数据匹配?好吧,要做到这一点,我需要通过 $_POST 使用存储在会话中的用户名查询数据库,如果他们已经修改了他们的会话,他们可能也修改了他们的用户名。
    • 您可以通过在用户登录时在用户对象中存储一次性盐或会话 ID 来防止这种情况。用户或登录用户表中的列可以存储它。这样,当 User->name 和 User->salt 与数据库中的内容不匹配时,它们就会失效。
    【解决方案3】:

    我认为用户操作此类内容的唯一方法是将其存储在用户计算机上的 cookie 中。

    getaccesslevel 是存储在 cookie 中,还是仅在检查登录 cookie 后才从服务器调用而不存储在用户计算机上?

    我假设如果仅在用户登录后才在服务器上调用它,那么除了通过其他安全漏洞手段之外,他们将无法轻松操纵它。

    只是我的猜测,我自己的安全性还不是很好。我会密切关注这个,看看其他人有什么要说的,也许我可以学到一些东西。

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2011-06-14
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多