【问题标题】:How secure are PHP sessions?PHP 会话的安全性如何?
【发布时间】:2012-04-27 06:27:50
【问题描述】:

我主要是一名 C++ 程序员,但我正在尝试学习一些 PHP。

显然,实现网络用户会话的方法是使用 $_SESSION 变量将用户的登录 ID 存储在 cookie 中。

难道不能让某人仅仅修改他们的 cookie、赋予他们不同的权限或以不同的用户身份登录吗?

似乎这种身份验证机制只是让用户将他们的 ID 存储在一个文件中 - 然后只是相信他们不会更改它。

有什么东西可以防止这种情况发生吗?

谢谢!

【问题讨论】:

标签: php session-cookies


【解决方案1】:

PHP 会话只有在您的应用程序创建它们时才是安全的。 PHP 会话会给用户一个伪随机字符串(“会话 ID”)以供他们识别自己,但如果该字符串被攻击者截获,攻击者可以假装是该用户。

做什么

此信息取自"Session Management Basics" in the PHP manual,但进行了一些简化。有些东西可能被遗漏了。请务必仔细阅读。

  1. Always use HTTPS

    • 防止攻击者读取会话 ID cookie
  2. 启用session.use_strict_mode

  3. 启用session.use_only_cookies并禁用session.use_trans_sid

    • 通过共享包含会话 ID 的 URL 来避免用户意外共享会话 ID
    • 防止会话 ID 出现在 Referer 标头中
  4. 定期regenerate the session IDinvalidate old session IDs shortly after regenerating

    • 如果攻击者使用其他用户的会话 ID,重新生成将使用户或攻击者的会话无效,具体取决于发出重新生成 ID 的请求的请求。然后,您可以跟踪某人何时尝试使用已重新生成的会话,并在该点使重新生成的会话无效。用户将能够登录,但攻击者(希望)将无法登录。
  5. 可以选择跟踪$_SESSION 中与请求相关的其他信息(IP 地址、用户代理字符串等)

    • 如果攻击者以某种方式获得了会话 ID 的访问权限,这可能会在攻击者访问任何数据之前检测到入侵。但是,请记住,这可能会恶化用户体验。例如,当用户从移动网络切换到 Wi-Fi 时,IP 地址可能会发生变化,而当他们的浏览器自动更新时,用户代理字符串可能会发生变化。根据您的网站愿意处理的权衡调整检查的数据。

【讨论】:

  • 很好的答案,但正如another question (已接受的答案,第 3 段) 所说,IP 跟踪 方法可能存在可用性问题对吧?
  • @AymDev 不幸的是,是的。由于从 LTE 切换到 WiFi,IP 可能会发生变化。浏览器版本可能会随着自动更新而改变。我已经更新了答案,并添加了一些关于保护 PHP 会话的额外(和更好)建议。
  • 在我看来,通过在会话中包含 IP 信息所获得的安全优势值得潜在的可用性问题。所有用户都获得了更高的安全性,只有一小部分用户有问题。在我们的系统上,那些确实有问题并向我们报告的人了解安全优势。
  • 这应该是公认的答案,因为它处理会话 ID 存储在用户端而不是服务器端的事实。
【解决方案2】:

不,会话存储在服务器上,用户无法访问。它用于存储整个站点的信息,例如登录会话。

这里是一个用法示例:

<?php
session_start();
if (password_verify($_POST['password'], $hash)) {
    $_SESSION['auth'] = true;
}
?>

然后可以跨站点访问会话以检查用户是否已通过身份验证。

<?php
session_start();
if ($_SESSION['auth']) {
    echo "You are logged in!";
}
?>

用户无法编辑这些值,但是会话 ID 通过 cookie 作为长随机字符串存储在计算机上。如果未经授权的用户获得了对这些字符串的访问权限,他们就有可能访问该站点。

【讨论】:

  • 所以会话数据存储在服务器上。那就是我出错的地方......谢谢
  • @James,会话信息没有公开存储,但会话 ID。应该采取额外的预防措施来防止这种情况发生。看我的回答。
  • 你们现在可能会更好地理解它,因为它是 2016 年 10 月,并且从现在起大约 4 年前提出并活跃了这个问题。我的意思是这个答案除了安全方面是错误的。
【解决方案3】:

如果这样做:

$_SESSION['user'] = $username;

那么$username 将不会直接存储在cookie 中。相反,将生成一个唯一的会话 ID 并将其存储在 cookie 中。

您存储在$_SESSION 中的信息仅存储在服务器端,从不发送到客户端。在客户端后续请求时,服务器将通过session_start()时存储在cookie中的id加载会话数据。

它相对安全。唯一可能发生的事情是有人可以截获会话 ID,从而窃取真实用户会话。 HTTPS 可以防止这种情况发生。

【讨论】:

  • 实际上,HTTPS 只是让发送给用户的 Cookie 无法读取。但是,如果攻击者以某种方式提出会话值,那么他们就可以获得访问权限。
【解决方案4】:

回答这个问题需要两种方法:

  1. 对于大多数用例来说,PHP 会话 ID 很难猜测。与其他广泛使用的系统相比,难度并不高或低。

  2. 对我来说,只信任一个会话 cookie(并且只信任一个会话 cookie 的存在)在安全方面似乎并没有走得太远,无论这个会话 cookie 来自哪里 - PHP 或其他地方。

因此,简而言之:PHP 会话与您的使用一样安全。这适用于我所知道的任何基于会话 cookie 的系统。

【讨论】:

    【解决方案5】:

    由于您是 C++ 程序员,您只需要知道客户端可见的会话只是不同地址空间(服务器)上的指针,因此无法从客户端模式访问会话。

    【讨论】:

      【解决方案6】:

      无论你在这个话题上得到什么答案,你很可能不会满意,因为关于这个话题有很多不同的意见。甚至还有关于会话和 PHP 安全性的整本书。

      您希望在这里得到的最佳答案可能是“会话与您希望的一样安全”。更多的工作和更多的预防措施显然会使它们使用起来更安全,但实施本身会消耗更多的时间。与所有事情一样,您是衡量安全程度是否足以满足您的需求的人。

      【讨论】:

        猜你喜欢
        • 2020-04-16
        • 2010-11-13
        • 1970-01-01
        • 2012-04-12
        • 2015-12-17
        • 1970-01-01
        • 2017-10-09
        • 2012-07-22
        相关资源
        最近更新 更多