【问题标题】:Security of $_SESSION array$_SESSION 数组的安全性
【发布时间】:2009-08-26 09:55:53
【问题描述】:

当低权限的非管理员用户成功登录我的 Web 应用程序时,我将以下数据存储在 $_SESSION 数组中:

$_SESSION = array(
    'user_id'     => 2343,  // whatever their user_id number is from the DB
    'allow_admin' => false, // don't give them access to admin tools
    'allow_edit'  => false, // don't let them edit stuff
    );

除了以某种方式编辑/tmp 中的会话文件之外,还有什么方法可以操纵$_SESSION 数组以授予他们管理员或编辑权限? (上面的代码是唯一将这些项目添加到$_SESSION的地方)

【问题讨论】:

    标签: php security session


    【解决方案1】:

    会话的内容仅在服务器端可见和可修改。

    如果您的应用程序或服务器包含一些漏洞,则只能以“未经授权”的方式对其进行修改。

    您还应该注意诸如session fixation attacks 之类的事情,其中​​攻击者将特定会话 ID 强加给毫无戒心的用户,当用户登录并提升该会话的权限时,允许攻击者共享该会话。

    缓解这些问题的一种方法是在您更改会话的权限级别时发送regenerate the session id

    另请参阅此问题:

    【讨论】:

      【解决方案2】:

      如果您想避免 javascript 读取您的 cookie 和中间人攻击,您需要使用带有 https 的服务器并将会话 cookie 设置为仅通过 https 传输。

      session.cookie_secure 指定 cookie 是否应该只通过安全连接发送。默认为关闭。此设置是在 PHP 4.0.4 中添加的。另见 session_get_cookie_params() 和 session_set_cookie_params()。

      session.cookie_httponly 将 cookie 标记为只能通过 HTTP 协议访问。这意味着 cookie 将无法通过 JavaScript 等脚本语言访问。此设置可以有效帮助减少通过 XSS 攻击进行的身份盗用(尽管并非所有浏览器都支持)。

      为了更好地保护让计算机无人看管几分钟的人的管理员权限,您应该在上次(管理员)登录时设置一个计时器。如果该时间超过 x 时间单位,则用户必须再次登录才能使用管理员权限。

      较短的会话也比较长的会话更安全。

      【讨论】:

        【解决方案3】:

        服务器

        会话存储在服务器上。如果用户可以直接访问存储会话的目录,则他们可以更改会话数据。解决此问题的方法是保护目录。并确保您的 php 代码中没有漏洞,您允许通过 $_POST 或 $_GET 设置 user_id。

        客户

        hijackingsomeones session_id 在客户端操作会话可能。这将使劫机者冒充该用户。并代表他们发送请求。

        还有跨站请求伪造。这是黑客欺骗用户发送him 的请求。例如,让他点击一个链接。你可以用令牌来解决这个问题。令牌是一个生成的字符串,它被放入 $_SESSION 数组和每个 HTML 表单中作为隐藏字段。当用户提交表单时,这些值会相互检查。每次用户请求新页面时,令牌都会更改。这样,攻击者必须尝试预测令牌,这取决于您如何制作令牌。

        这些链接还将显示这些攻击的示例。

        【讨论】:

          【解决方案4】:

          如果您不在脚本中提供此类访问权限,则用户对此无能为力。所以你的会话数据应该是相当安全的。用户唯一能做的就是操纵在 URL 中传递的会话 cookie 或会话 ID,但他不太可能找到另一个用户的现有会话 ID。

          【讨论】:

            【解决方案5】:

            除非您在某处留下了安全漏洞(例如允许用户以某种方式添加/更改 $_SESSION 数据)。

            【讨论】:

              【解决方案6】:

              据我所知,没有,除非用户猜出您的会话 ID 并将其替换到他的 cookie 中。您应该至少在服务器端添加额外的 IP 检查以防止这种情况发生。

              【讨论】:

                猜你喜欢
                • 2011-05-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-10-27
                • 2013-04-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多