使用安全会话在HTTP和HTTPS页面之间切换
更新:请注意,每个网站在不安全的HTTP和加密的HTTPS页面之间切换,都不可避免地容易出现SSL-strip。 请考虑在整个网站上使用HTTPS,但这既不能防止SSL-strip,至少这让用户可以安全地呼叫该网站,如果他在意的话。 对于需要切换的网站,此方法可能仍然是最佳选择。
这是一种常见的情况,一个网站的页面含有敏感数据,应该只能使用HTTPS协议访问,而其他数据则使用非关键数据。
我发现了一个允许在安全和非安全页面之间切换的解决方案,同时保留了会话,并且希望向您提供有关该概念中的缺陷的任何提示 。 您可以在这里找到整篇文章:使用SSL保护会话cookie(当然,我也很高兴听到,它是安全的)。
问题
HTTPS确保客户端和服务器之间无人可以窃听我们的通信并防止中间人攻击。 不幸的是,这不适用于会话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>');
...
?>
现在,每个页面(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连接发送。
非常感谢每一个答案!
一个更简单的选择:它成为越来越被接受的替代方案,一直使用TLS,而不是在安全和不安全的连接之间来回切换。 大部分额外的处理时间用于设置安全通道,但这只会执行一次并缓存(通常)。 后续流量的对称加密在现代处理器上非常非常快。 相信这会导致服务器开销或可伸缩性问题,这已经有点过时了。
在最近的一篇博客文章中,一位Google工程师报告说,当他们转而使用HTTPS时,他们发现他们的服务器只听到了4%的增长。 (找不到引文。)
链接地址: http://www.djcxy.com/p/23657.html上一篇: Switching between HTTP and HTTPS pages with secure session
下一篇: Creating a secure login using sessions and cookies in PHP