当前位置:  开发笔记 > 编程语言 > 正文

在PHP中从HTTP切换到HTTPS时会话丢失

如何解决《在PHP中从HTTP切换到HTTPS时会话丢失》经验,为你挑选了4个好方法。

将用户发送到结帐页面时,会将其切换http://sitename.comhttps://sitename.com.

结果,$_SESSION变量丢失了.

该站点具有有效的SSL证书,可能会或可能不会使用.



1> 小智..:

在同一服务器上的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,我实际上并没有运行这些脚本,所以可能会有一两个错误,导致它们无法正常运行.


安全问题:有人可能会不断访问您的网站并猜测session_id变量,最终劫持其他人的会话.我不知道盐渍哈希是如何工作的,因为这是一个单向操作; 你用盐水打哈希密码,并为密码尝试做同样的事情,但在这种情况下,这不会起作用; 你需要原始价值.
另外使用salted散列将保证此过程.
@DeanJ - 生成校验和服务器端并将其作为参数沿URL解析.例如,您可以生成哈希,如:`$ hash = md5($ currentSessionID.coomecretsalt')`,然后url应该看起来像?session ='.$ currentSessionID.'&hash ='.$ hash.在目标网站上,您将检查是否md5($ _ GET ['session'].'somesecretsalt')== $ _GET ['hash'].这样你可以说,session_id不仅仅是弥补了.会话ID与服务器生成的哈希匹配(使用长盐值时几乎不可能破解).

2> JW...:

听起来会话cookie设置为安全.Cookie具有"安全"标志,如果设置为true,则表示该Cookie不会发送到非https网站.PHP可能正在使用它的会话cookie.您可以使用session_set_cookie_params函数或php.ini中的session.cookie_secure设置更改此设置.



3> Tom..:

我们也有这个问题.原来是因为我们在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.



4> Mike Purcell..:

以下解决方案假定安全和非安全服务器可以访问相同的后端服务(缓存,数据库存储等).

当用户在完成购物时将用户发送到我们的结帐流程时,我们必须处理同样的问题.为了解决这个问题,我们设置了一个缓存层并缓存了所有相关数据.例如,我们将从会话值中收集产品ID和用户ID,序列化它们,创建哈希,最后使用哈希作为键将会话数据存储在缓存中.然后,我们将使用url中的哈希将用户重定向到安全站点.

当用户最终进入安全站点时,我们将尝试根据哈希将数据从缓存中提取出来.然后使用用户ID和产品ID,我们可以从数据库中加载所有定价和描述数据,并呈现给用户进行最终结账审核.

存在继承风险,因为缓存数据是易变的,但我们从未遇到过任何问题,因为重定向很快发生.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有