PHP会话的安全性如何?

问题描述 投票:29回答:7

我主要是C ++程序员,但是我想学习一些PHP。

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

某人是否不可能仅修改其cookie,为他们提供不同的特权或以其他用户身份登录?

似乎这种身份验证机制只是让用户将其ID存储在文件中,然后信任他们不要更改它。

是否有防止这种情况发生?

谢谢!

php session-cookies
7个回答
17
投票

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

这里是用法示例:

<?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作为长随机字符串存储在计算机上。如果未经授权的用户可以访问这些字符串,则他们可以访问该站点。


36
投票

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

怎么办

此信息取自"Session Management Basics" in the PHP manual,但简化了一点。有些事情可能已经错过了。请确保也仔细阅读。

  1. Always use HTTPS

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

  3. 启用prefix和禁用$userId-

    • 通过共享其中包含会话ID的URL,避免用户意外共享会话ID
    • 防止会话ID出现在sessions.use_only_cookies标头中
  4. 定期sessions.use_only_cookiessession.use_trans_sid

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

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

5
投票

回答此问题需要两种方法:

  1. PHP会话ID很难在大多数使用情况下进行猜测。不比其他广泛使用的系统难或难的多。

  2. 仅信任会话cookie(并且仅保留会话cookie的存在)对我来说在安全方面似乎没有多大帮助,无论该会话cookie来自何处-PHP或其他地方。

因此,简而言之:PHP会话是安全的,就像您对它们的使用一样。对于我所知道的任何基于会话cookie的系统都是如此。


4
投票

如果这样做:

Referer

然后regenerate the session ID将不会直接存储在Cookie中。而是将生成一个唯一的会话ID,并将其存储在Cookie中。

您存储在invalidate old session IDs shortly after regenerating中的信息仅存储在服务器端,而从未发送给客户端。根据客户端的后续请求,当您执行$_SESSION时,服务器将通过cookie中存储的ID加载会话数据。

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


1
投票

无论您对这个主题有什么回答,您都会很不满意,因为对此主题有很多不同的意见。甚至还有整本关于会话和PHP安全性的完整书籍。


0
投票

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


0
投票

这取决于您给他们的用途,靠他们自己并不是很安全。例如,如果使用它们创建登录系统,则用户正确登录后,将在服务器中创建一个会话(例如,与他的数据库ID相关),而且还将创建一个cookie并将其存储在在每个http请求中发送到服务器的计算机(大而随机的字符串),以便将用户设备与会话相关联(而不是每次发送用户凭据)。因此,问题在于,如果另一个用户复制存储在您设备中的相同cookie,则服务器将认为他也已登录您的帐户。因此,您需要实现一种更安全的方法来解决此问题,也许,如果http请求来自用户最初登录时所使用的IP或类似的地址,则仅允许会话标识。

© www.soinside.com 2019 - 2024. All rights reserved.