PHP 会话的安全性如何?该怎么办

2022-08-30 12:34:31

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

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

难道有人不能修改他们的cookie,给他们不同的权限或以不同的用户身份登录吗?

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

有什么东西可以阻止这种情况吗?

谢谢!


答案 1

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

该怎么办

此信息摘自 PHP 手册中的“会话管理基础知识”,但进行了一些简化。有些东西可能被遗漏了。请务必通读。

  1. 始终使用 HTTPS

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

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

    • 通过共享包含会话 ID 的 URL 来避免用户意外共享会话 ID
    • 防止会话 ID 显示在标头中Referer
  4. 定期重新生成会话 ID,并在重新生成后不久使旧会话 ID 失效

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

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

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


推荐