将用户发送到结帐页面时,会将其切换http://sitename.com
为https://sitename.com
.
结果,$_SESSION
变量丢失了.
该站点具有有效的SSL证书,可能会或可能不会使用.
在同一服务器上的HTTP和HTTPS服务之间切换时,您的HTTP会话ID不会传递到HTTPS会话.您可以通过以下三种方式之一将会话ID从HTTP页面传递到HTTPS页面来进行设置:
来自PHP:session_start:
session_start()
根据通过请求传递的当前会话ID(例如GET,POST或cookie)创建会话或恢复当前会话
当您使用会话时,通常会启动脚本session_start()
.如果浏览器设置了会话ID cookie,session_start()
则将使用该会话ID.如果浏览器没有设置会话ID cookie,session_start()
则会创建一个新的cookie .
如果未设置会话ID(在您的示例中,浏览器正在为HTTPS会话创建新的会话ID cookie),则可以使用该session_id()
功能进行设置.session_id()
还可以方便地将会话ID作为字符串返回.所以
... $currentSessionID = session_id(); ...
将$currentSessionID
变量设置为等于当前会话ID,和
... session_id($aSessionID); ...
将浏览器中的sessionID cookie设置为$aSessionID
.来自PHP:session_id
这是一个包含两个脚本的示例.一个通过HTTP访问,另一个通过HTTPS访问.它们必须位于同一服务器上才能维护会话数据.
脚本1(HTTP):
Click here to transfer your session to the secure server'; ?>
脚本2(HTTPS):
为此,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设置更改此设置.
我们也有这个问题.原来是因为我们在PHP安装上使用了suhosin补丁.我们通过设置suhosin.session.cryptdocroot = Off
来修复它/etc/php.d/suhosin.ini
.
有关suhosin手册,suhosin.session.cryptdocroot
请参阅http://www.hardened-php.net/suhosin/configuration.html#suhosin.session.cryptdocroot.
我们最初从这篇博客文章中找到了修复程序:http://www.yireo.com/blog/general-news/315-switch-between-http-and-https-looses-php-session.
以下解决方案假定安全和非安全服务器可以访问相同的后端服务(缓存,数据库存储等).
当用户在完成购物时将用户发送到我们的结帐流程时,我们必须处理同样的问题.为了解决这个问题,我们设置了一个缓存层并缓存了所有相关数据.例如,我们将从会话值中收集产品ID和用户ID,序列化它们,创建哈希,最后使用哈希作为键将会话数据存储在缓存中.然后,我们将使用url中的哈希将用户重定向到安全站点.
当用户最终进入安全站点时,我们将尝试根据哈希将数据从缓存中提取出来.然后使用用户ID和产品ID,我们可以从数据库中加载所有定价和描述数据,并呈现给用户进行最终结账审核.
存在继承风险,因为缓存数据是易变的,但我们从未遇到过任何问题,因为重定向很快发生.