PHP如何将原始cookie解析为$_COOKIE?

9
我有一个关于跨域AJAX请求的问题。
这个问题涉及到三个服务器,我们可以称它们为A1、A2和B。
A1和A2运行相同的应用程序代码。它们是同一个Web应用程序的两个分段实例。B是另一个Web应用程序。
我们需要从A Web应用程序向B应用程序执行跨域AJAX请求。我们尝试启用CORS,但在IE <=8中难以令人满意地工作,因此现在我们使用nginx代理规则。流程是:浏览器ajax请求-> A1或A2-> nginx代理-> B
B是有状态的,并且需要用户的会话cookie才能正常工作。
我们看到的情况是,当使用服务器A1时,这个过程可以正常工作,但当使用服务器A2时,B无法提取cookie。
我查看了来自A1A2的请求头,它们是相同的。两者都在头部中有cookies行,都有相同的来源等。
B上,当请求来自A2时,$_COOKIE ['session_key']为空,但当请求来自A1时,它被正确地填充。
奇怪的是,它只缺少从A2的标头中提取一个特定的cookie键,并且只有当请求来自A2时才会出现此问题。它可以正常解析A2的headers中的每个其他cookie,但由于某种原因无法解析用户的会话cookie,但如果请求来自A1,则可以正常解析。
我使用了tcpdump并获取了每个请求的pcap文件,并进行了比较,但是标头中没有什么特别不同的地方。
我发现了这个Stack Overflow的问题,有人说是因为他的cookie头字符串太长了:当$_COOKIE中有值时,为什么在$_SERVER中没有设置cookie。我认为我的cookie长度并不算太长,因为在成功和失败的情况下都只有249个字符。
我已经考虑过从$_SERVER手动解析cookie,但那听起来很愚蠢,我更希望找出潜在的问题。

用户的会话在A1和A2服务器上都设置了吗?会话数据是如何在服务器上创建的?它们是同一台机器吗? - voncox
4个回答

0

使用IE<=8时会遇到一个叫做P3P的问题。我发现将一个P3P头部信息添加到接受你的AJAX/JSON请求的页面上(在你的情况中是B服务器)可以解决这个问题:

header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');

关于服务器A2不向服务器B发送$_COOKIE请求的问题,我建议使用_GET将请求发送到服务器B上的某种init页面。这样可以处理并存储在服务器B上。然后,在所有需要此信息的其他页面中,您可以查看服务器B以确定是否已发送该信息,或者持续发送_GET数据到每个页面并将其与已有信息进行比较。提醒一下,此信息应严格监控,因为它会更容易被修改。
很抱歉,我意识到这并不能解决问题,但可以提供另一种解决方案。

1
这在所有浏览器中都会发生,不仅仅是IE。我认为一个解决方法是手动解析$_SERVER['HTTP_COOKIE_VARS'],只有在请求被A2转发时,但我更愿意找到潜在的问题。 - ashgromnies
P3P 头部更改无法生效的另一个原因是,我们在这种情况下遇到的问题是 IE 的 XDomainRequest 对象的限制。它根本不支持 cookies。它非常糟糕,所以我们必须使用代理。 - ashgromnies

0

前段时间,我需要进行跨域ajax请求。显然,当我尝试在IE中设置一个“允许x-domain ajax”的头时(不记得确切的头名称),我遇到了同样的问题。

为了解决这个问题,我使用了服务器之间的CURL。因此,我的ajax脚本(用PHP编写)能够通过JSON + CURL通过服务器交换数据,通过进行CURL POST发送,并通过CURL GET检索数据,而不管涉及哪些域。

请原谅我,也许这不是您需要的确切答案,但是,在我看来,这可能会帮助寻找跨站点ajax的人。


0

在服务器之间使用GET方法即可。并建立一种哈希方式,以便如果某个服务器未能完成请求,则用户无法看到实际的Cookie内容。


0

这里并非 PHP 的问题。

我们使用 Kohana,它在初始化时运行一些代码,试图为会话 cookie 添加额外的安全性。相关代码验证服务器端会话记录的 IP 地址是否与请求头中发送的 IP 地址匹配。

由于我们的网络配置,在与 B 服务器联系时,我收到的是外部 IP,在与 A2 联系时,我收到的是内部 IP,在与 A1 联系时,我收到的是外部 IP。

当 A2 将带有内部 IP 的请求转发给 B 时,触发了 Kohana 基于 IP 的 cookie 保护,因为该 cookie 是用我的外部 IP 创建的,但现在却尝试由我的内部 IP 使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接