如何在PHP中重定向后解决丢失会话的问题?
最近,我遇到了一个非常常见的重定向失败会话问题.在搜索了这个网站后,我仍然找不到解决方案(虽然这是最接近的).
更新
我找到了答案,我想我会在这里发布,以帮助遇到同样问题的人.
我正在制作一个需要相当安全的CakePHP系统,因为我们处理的是钱,客户账户等.到目前为止,一切都很好,直到我必须与我需要的支付平台集成重定向到他们的网站,他们重定向回我的网站.
这在我的开发机器(debug = 2)中工作正常,但在生产中,当客户被重定向回来时,他得到登录提示而不是回到他的"登录区域".经过多次挖掘后我发现这是因为CakePHP设置了session.referer_check,如果HTTP_REFERER来自另一个主机而不是我的,则会使会话无效.
现在,通常情况下,我会毫不犹豫地禁用它,但在这个系统中我更关注安全性而不是正常情况.
我的问题是session.referer_check究竟应该保护我什么?
如果我将其关闭,我的网站可以进行什么样的攻击/利用/坏事?
我猜这里存在一些原因,但是我无法想象它会保护我什么.
你能给我任何想法吗?
安全禁用吗?
谢谢
Daniel
我有一个基于jQuery的网络应用程序.我的要求非常简单:我想使用jQuery来确定用户是否在其Web浏览器中启用或禁用了cookie.我知道有一个可用的插件可用于创建/检索/删除/更新cookie.但是,有没有一种方法可以检测用户代理的设置?
我的CakePHP应用程序出现问题.这似乎只发生在IE中,并且仅在某些计算机上发生.虽然它在计算机上是一致的.
问题一: 用户已登录并在页面https://example.com/users/view上点击退出.用户被重定向到http://example.com并且似乎已注销,直到用户访问另一个https页面并且他们仍然登录.他们可以根据需要单击注销,但他们始终登录https并且只能在http上注销.
问题二: 用户登录https://example.com/users/signin,他们会被重定向到http://example.com,现在似乎已登录.用户访问https://example.com/admin/幻灯片,但现在还不知道,但现在已注销,点击任何其他页面(或只是刷新当前页面)将要求他们再次登录.
我不知道是怎么回事.我已经阅读并尝试了在这两个类似问题上描述的解决方案:从ssl转移到非ssl时会话不保存,而在IE中不更新/覆盖Cookie但我仍然遇到同样的问题.
到目前为止,我注意到的唯一线索(并且我不知道这是否意味着什么)就是当我在HTTP页面上调试时$_SESSION,$this->Session->read()总是只有$ this-> Session-> read()返回一个值.在HTTPS页面上,有些ALWAYS总是为两者返回相同的值,其他ALWAYS只返回$ this-> Session-> read()的值.
例如,http://example.com和https://example.com/users永远不会看到$ _SESSION,https://example.com/carts总是会看到$ _SESSION.我不确定,但我在想,也许安全页面可能会看到它,因为有些可能不会出现问题,但是当我检查代码时,我看到没有区别,这表明为什么一个人做,一个人没有吨.
此外,如果我$this->Session->destroy()在AppController中添加到beforeFilter,那么所有页面甚至HTTP都可以看到$ _SESSION.我实际上并没有在我的应用程序中使用$ _SESSION,我只是觉得这可能是一个错误的线索.
UPDATE
我接受了Gustav Bertram的建议并查看了用户代理字符串.我在没有问题的计算机上将用户代理字符串与IE上的IE进行了比较.它们是相同的,除了有问题的用户代理字符串中有"google chrome frame".我从该计算机上卸载了Google Chrome Frame,重新启动,再次尝试,问题似乎已经解决了.
如果这是真正的原因,那么简单的解决方案就是让用户卸载Chrome框架.但是我想知道是否有一个解决方案可以让他们安装镀铬框架并且仍然有效.
user_id会话变量.header('Location')重定向.重定向到同一个域,所有页面都有 session_start();
而且我发现它更有可能发生在IE中而不是FF ...奇怪.