gpt4 book ai didi

php - 使用安全 session cookie 在 HTTP 和 HTTPS 页面之间切换

转载 作者:IT王子 更新时间:2023-10-29 01:16:44 26 4
gpt4 key购买 nike

Update: Note that every website switching between unsecure HTTP and encrypted HTTPS pages, is inevitable prone to SSL-strip. Please think about using HTTPS for the whole site, although this neither can prevent SSL-strip, at least this gives the user the possibility to call the site safely, if he cares. For sites that need to switch, this method is probably still the best option.

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

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

问题

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

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

身份验证 cookie

身份验证 cookie 的想法是,当用户输入他的密码(增加他的访问权限)时,我们会在不安全的 session 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)都可以读取不安全的 session 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
}

...
?>

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

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

最佳答案

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

在最近的一篇博文中,一位 Google 工程师报告说,当他们为 GMail 切换到仅 HTTPS 时,他们发现他们的服务器窃听仅增加了 4%。 (找不到引文。)

关于php - 使用安全 session cookie 在 HTTP 和 HTTPS 页面之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5843305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com