在 PHP 中从 HTTP 切换到 HTTPS 时会话丢失
将用户发送到结帐页面时,用户将从 切换到 。http://sitename.com
https://sitename.com
结果,变量将丢失。$_SESSION
该网站具有有效的SSL证书,该证书可能具有某些用途,也可能没有用处。
将用户发送到结帐页面时,用户将从 切换到 。http://sitename.com
https://sitename.com
结果,变量将丢失。$_SESSION
该网站具有有效的SSL证书,该证书可能具有某些用途,也可能没有用处。
在同一服务器上的 HTTP 和 HTTPS 服务之间切换时,您的 HTTP 会话 ID 不会传递到 HTTPS 会话。您可以通过以下三种可能的方式之一将会话 ID 从 HTTP 页面传递到 HTTPS 页面来设置它:
session_start()
创建会话或根据通过请求传递的当前会话 ID(如 GET、POST 或 Cookie)恢复当前会话
使用会话时,通常使用 启动脚本。如果浏览器设置了会话 ID Cookie,将使用该会话 ID。如果浏览器没有设置会话 ID cookie,将创建一个新的会话 ID。session_start()
session_start()
session_start()
如果未设置会话 ID(在您的示例中,浏览器正在为 HTTPS 会话创建新的会话 ID Cookie),则可以使用该函数进行设置。 还可以方便地将会话 ID 作为字符串返回。所以session_id()
session_id()
...
$currentSessionID = session_id();
...
将变量设置为等于当前会话 ID,以及$currentSessionID
...
session_id($aSessionID);
...
将浏览器中的会话 ID Cookie 设置为 。从 PHP: session_id$aSessionID
下面是一个包含两个脚本的示例。一个通过HTTP访问,另一个通过HTTPS访问。它们必须位于同一台服务器上才能维护会话数据。
脚本 1(HTTP):
<?php
// This script will create a session and display a link to your secure server address
// to transfer your session ID. In this example, the secure page to receive the session
// ID is located at http://www.yoursite.com/safePages/securePage.php
// Start a session using the current session ID stored in a cookie, or create
// a new session if none is set.
session_start();
$currentSessionID = session_id();
// Set a variable that will be retrieved with the HTTPS script.
$_SESSION['testvariable'] = 'It worked';
// $secureServerDomain is the domain of your secure server
$secureServerDomain = 'www.yoursite.com';
// $securePagePath is the path to the page that will receive and set the session ID.
$securePagePath = '/safePages/securePage.php'
echo '<a href="https://' . $secureServerDomain . $securePagePath . '?session="' . $currentSessionID . '">Click here to transfer your session to the secure server</a>';
?>
脚本 2(
<?php
// Retrieve the session ID as passed via the GET method.
$currentSessionID = $_GET['session'];
// Set a cookie for the session ID.
session_id($currentSessionID);
// Start a session.
session_start();
// Test retrieval of variable set when using HTTP.
if (!empty($_SESSION['testvariable'])) {
echo $_SESSION['testvariable'];
} else {
echo 'It did not work.';
}
?>
为此,HTTP和HTTPS服务器必须使用相同的会话数据存储基板(即,对于默认文件处理程序,使用相同的php.ini在同一台物理机器上运行)。这里有一些安全漏洞,所以我不会使用此代码来传输敏感信息。它只是一个可行的例子。
当我之前遇到这个问题时,我想出了上述快速解决方案,但我只是记住了问题的原始原因。我从 http://www.example.com/page.php 到 https://example.com/page.php(注意缺少“www”)。确保 http://www.example.com/page.php 将链接到 https://www.example.com/page.php,http://example.com 将链接到 https://example.com/page.php。
PS,我实际上没有运行这些脚本,因此可能有一两个拼写错误阻止它们按原样正常运行。
听起来会话 Cookie 设置为安全。Cookie 具有“安全”标志,如果设置为 true,则表示 Cookie 不会发送到非 https 站点。PHP可能正在将其用于其会话cookie。您可以使用session_set_cookie_params函数或php.ini中的session.cookie_secure设置来更改此设置。