PHP会话的安全性如何?

时间:2012-04-15 19:46:02

标签: php session-cookies

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

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

是否有人只能修改他们的cookie,赋予他们不同的权限或以其他用户身份登录?

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

有什么东西阻止了这个吗?

谢谢!

6 个答案:

答案 0 :(得分:32)

PHP会话只有在您的应用程序提供时才是安全的。 PHP会话将为用户提供伪随机字符串(“会话ID”),以便他们识别自己,但如果该字符串被攻击者截获,则攻击者可以伪装成该用户。

怎么做

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

  1. Always use HTTPS

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

  3. 启用sessions.use_only_cookies并停用session.use_trans_sid

    • 通过共享其中包含会话ID的网址,意外避免用户共享会话ID
    • 阻止会话ID显示在Referer标题
  4. 定期regenerate the session IDinvalidate old session IDs shortly after regenerating

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

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

答案 1 :(得分:11)

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

以下是用法示例:

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

答案 2 :(得分:5)

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

  1. PHP会话ID很难猜到大多数用例。没有比其他广泛使用的系统更难或更硬。

  2. 只信任会话cookie(并且只存在会话cookie)对我来说似乎不是很安全,无论这个会话cookie来自哪里 - PHP或其他地方。

  3. 因此,简而言之:PHP会话是安全的,因为您使用它们会使它们变得安全。对于我所知道的任何基于会话cookie的系统都是如此。

答案 3 :(得分:3)

如果这样做:

$_SESSION['user'] = $username;

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

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

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

答案 4 :(得分:1)

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

你希望得到的最佳答案可能是“会议和你想要的一样安全”。更多的工作和更多的预防措施显然会使它们更安全,但实现本身将消耗更多的时间。与您所做的一切一样,您可以根据自己的需要来衡量安全性的安全程度。

答案 5 :(得分:0)

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