PHP 会话的安全性如何?

Posted

技术标签:

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

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

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

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

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

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

谢谢!

【问题讨论】:

关于这个话题有整本书。 phpsec.org/projects/guide/4.html, ***.com/questions/3641958/…, ***.com/questions/5608764/…, ***.com/questions/4110986/…, ***.com/questions/1181105/… How safe are PHP session variables?的可能重复 【参考方案1】:

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

做什么

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

    Always use HTTPS

    防止攻击者读取会话 ID cookie

    启用session.use_strict_mode

    Rejects uninitialized session IDs 确保创建的任何会话实际上都是有效的,因此您可以信任 prefix(例如,如果前缀是 $userId-

    启用session.use_only_cookies并禁用session.use_trans_sid

    通过共享包含会话 ID 的 URL 来避免用户意外共享会话 ID 防止会话 ID 出现在 Referer 标头中

    定期regenerate the session ID 和invalidate old session IDs shortly after regenerating

    如果攻击者使用其他用户的会话 ID,重新生成将使用户或攻击者的会话无效,具体取决于发出重新生成 ID 的请求的请求。然后,您可以跟踪某人何时尝试使用已重新生成的会话,并在该点使重新生成的会话无效。用户将能够登录,但攻击者(希望)将无法登录。

    可以选择跟踪$_SESSION 中与请求相关的其他信息(IP 地址、用户代理字符串等)

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

【讨论】:

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

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

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于PHP 会话的安全性如何?的主要内容,如果未能解决你的问题,请参考以下文章

php会话变量的安全性如何[重复]

PHP 登录和处理会话安全

PHP + socket.io(会话、授权和安全问题)

PHP 会话安全

在 PHP 中使用会话和 cookie 创建安全登录

PHP 会话控制技术