使用安全会话 Cookie 在 HTTP 和 HTTPS 页面之间切换

2022-08-30 15:44:22

更新:请注意,每个网站在不安全的HTTP和加密的HTTPS页面之间切换,不可避免地容易出现SSL条带。请考虑对整个站点使用HTTPS,尽管这两者都不能阻止SSL条带,但至少这为用户提供了安全调用站点的可能性,如果他关心的话。对于需要切换的网站,此方法可能仍然是最佳选择。

这是一种常见的情况,即网站具有包含敏感数据的页面,这些页面只能使用HTTPS协议访问,而其他页面则具有非关键数据。

我找到了一个解决方案,允许在安全页面和非安全页面之间切换,同时保持会话,并希望向您询问有关概念中缺陷的任何提示。您可以在这里找到整篇文章:使用SSL的安全会话cookie(当然,我也很高兴听到,它是安全的)。

问题

HTTPS确保客户端和服务器之间的任何人都无法窃听我们的通信,并防止中间人攻击。不幸的是,这不适用于会话cookie,它也被发送到未加密的请求。

PHP 提供函数 session_set_cookie_params(...) 和参数 $secure。这是我们需要的,但它给我们留下了一个问题,即当我们切换到不安全的页面时,我们会失去会话。

身份验证饼干

身份验证cookie的想法是,当用户输入他的密码(增加他的访问权限)时,我们会在不安全的会话cookie之外创建第二个cookie,并确保只有加密的HTTPS页面才能访问它。

https://www.example.com/login.php

<?php
  session_start();
  // regenerate session id to make session fixation more difficult
  session_regenerate_id(true);

  // generate random code for the authentication cookie and store it in the session
  $authCode = md5(uniqid(mt_rand(), true));
  $_SESSION['authentication'] = $authCode;

  // create authentication cookie, and restrict it to HTTPS pages
  setcookie('authentication', $authCode, 0, '/', '', true, true);

  print('<h1>login</h1>');
  ...
?>

现在,每个页面(HTTPS 和 HTTP)都可以读取不安全的会话 Cookie,但包含敏感信息的页面可以检查安全身份验证 Cookie。

https://www.example.com/secret.php

<?php
  session_start();

  // check that the authentication cookie exists, and that
  // it contains the same code which is stored in the session.
  $pageIsSecure = (!empty($_COOKIE['authentication']))
    && ($_COOKIE['authentication'] === $_SESSION['authentication']);

  if (!$pageIsSecure)
  {
    // do not display the page, redirect to the login page
  }

  ...
?>

攻击者可以操纵会话 Cookie,但他永远无权访问身份验证 Cookie。只有输入密码的人才能拥有身份验证cookie,它始终通过加密的HTTPS连接发送。

非常感谢您的每一个答案!


答案 1

一个更简单的替代方案:一直使用TLS,而不是在安全和不安全的连接之间来回切换,这正变得越来越被接受。大部分额外的处理时间都花在设置安全隧道上,但这只完成一次并缓存(通常)。在现代处理器上,后续流量的对称加密非常非常快。认为这会导致服务器开销或可伸缩性问题的想法有些过时。

在最近的一篇博客文章中,一位谷歌工程师报告说,当他们切换到仅限HTTPS的GMail时,他们发现他们的服务器偷听声只增加了4%。(找不到引文。


答案 2

推荐