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

mar*_*kli 28 php encryption ssl https session-cookies

更新:请注意,在不安全的HTTP和加密的HTTPS页面之间切换的每个网站都不可避免地容易出现SSL剥离.请考虑在整个站点使用HTTPS,虽然这既不能阻止SSL-strip,但至少这样可以让用户安全地调用站点,如果他在意的话.对于需要切换的站点,此方法可能仍是最佳选择.

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

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

问题

HTTPS确保客户端和服务器之间没有人可以窃听我们的通信并防止中间人攻击.不幸的是,这不适用于session-cookie,它也被发送到未加密的请求.

PHP使用参数$ secure提供函数session_set_cookie_params(...).这就是我们所需要的,但是当我们切换到不安全的页面时,它会让我们忘记我们的会话.

身份验证Cookie

身份验证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>');
  ...
?>
Run Code Online (Sandbox Code Playgroud)

现在,每个页面(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
  }

  ...
?>
Run Code Online (Sandbox Code Playgroud)

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

非常感谢每一个答案!

jwi*_*mar 24

一个更简单的替代方案:它正逐渐成为一种越来越被接受的替代方案,而不是在安全连接和不安全连接之间来回切换.大部分额外的处理时间用于设置安全隧道,但这只执行一次并缓存(通常).在现代处理器上,后续流量的对称加密非常非常快.认为这会导致服务器开销或可扩展性问题,这有点过时了.

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

  • 文章链接:http://www.imperialviolet.org/2010/06/25/overclocking-ssl.html (4认同)
  • 是否有关于该主题的其他独立文章(基准)?每个人都提到这篇文章. (4认同)
  • PHP不受HTTPS的影响.事实上,在PHP服务器前面通过反向SSL nginx代理完成所有HTTPS操作非常流行,它们执行所有处理并通过线路将未加密的数据发送到代理.喜欢[so](http://www.cyberciti.biz/faq/howto-linux-unix-setup-nginx-ssl-proxy/). (2认同)