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
启用session.use_strict_mode
:
$userId-
)
启用session.use_only_cookies
并禁用session.use_trans_sid
Referer
标头中
定期regenerate the session ID 和invalidate old session IDs shortly after regenerating
如果攻击者使用其他用户的会话 ID,重新生成将使用户或攻击者的会话无效,具体取决于发出重新生成 ID 的请求的请求。然后,您可以跟踪某人何时尝试使用已重新生成的会话,并在该点使重新生成的会话无效。用户将能够登录,但攻击者(希望)将无法登录。可以选择跟踪$_SESSION
中与请求相关的其他信息(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 会话的安全性如何?的主要内容,如果未能解决你的问题,请参考以下文章