PHP 会话设置在另一台服务器上

PHP sessions set on another server

我正在尝试理解 php 中的 session。 据我了解,在基本登录系统中,sessions 的工作方式如下: 在页面 exampledomain.com/login.php:

if (password_verify($_POST['user_password'], $result->password_hash)) {
  //write user data into PHP SESSION
  $_SESSION['user_name'] = $_POST['user_name'];
}

然后在只有登录用户才能查看的页面我检查:

if (isset($_SESSION['user_name'])) {
  //do something
}

现在我不明白的是,如果黑客在他自己的服务器 (hackerdomain.com) 上做这样的事情,假设他知道用户名:

session_start();
$_SESSION['user_name'] = 'Test';

<form method="post" action="exampledomain.com/page-only-logged-in-users-can-view.php" name="loginform">
 <input type="submit"  name="login" value="Login" />
</form>

现在他在 $_SESSION['user_name'] 中设置了一个值,这样他就可以登录,甚至不需要密码。 我对 session 这件事感到很困惑。我阅读了 php 文档,但我还是不明白。

最后一个session是服务器发送给浏览器的cookie。这个 cookie 很特别,有一些属性,比如:

  • 姓名。例如,在 php 默认情况下,PHPSESSID
  • 值。对于 session id,一个随机字符串,用于标识服务器上的 cookie(此 cookie 具有关联数据,如用户名、电子邮件等)
  • 域:定义cookie的域范围,cookie将由浏览器发送到其中(例如:非值表示只有主域服务器生成没有子域的cookie。域值默认包括子域)
  • Path:Path 表示 URL 路径必须存在于所请求的 URL 中才能发送 Cookie header
  • Expires / Max-Age:cookie 在特定时间过期(例如:2018-08-03T17:30:56.146Z)
  • httpOnly: 布尔值,如果为true则cookie不能被javascript访问(document.cookie)以防止XSS攻击
  • Secure: 布尔值,如果为真cookie必须在https下发送
  • 同一站点:SameSite cookie 让服务器要求 cookie 不应与 cross-site 请求一起发送,这在一定程度上可以防止 cross-site 请求伪造攻击 (CSRF)。 SameSite cookie 仍处于实验阶段,尚未得到所有浏览器的支持。

更多信息请访问 https://developer.mozilla.org/es/docs/Web/HTTP/Cookies

会话存储在处理请求的服务器上。为每个会话生成一个唯一标识符。

有一些针对会话的攻击:

  • 会话修复 - 当攻击者知道会话 ID 时,他可以在 url 中显式设置 PHPSESSID。通常,这是在 cookie 文件中设置的
  • 当您使用数据包嗅探器获取 cookie 并使用此 cookie 时,会话端劫持。
  • XSS 当有人将一些代码 f.e 放入 iframe 并且当您进入页面时它会根据会话
  • 以您的权限执行代码

如果黑客执行您编写的操作,它将生成会话,但会在他自己的服务器上生成会话,而不是在您的服务器上。默认情况下 PHP 将会话存储在文件中,目录设置在 php.ini 中并且可以使用 session_save_path(); 函数可见。即使他执行相同的代码,他也无法访问 $result->password_hash,因为我猜它来自他无权访问的数据库。

希望你现在明白了。