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

时间:2013-01-31 16:03:06

标签: php cookies session-cookies

我遇到跨域AJAX请求的问题。

此问题涉及三台服务器。我们可以称之为 A1 A2 B

A1 A2 正在运行相同的应用程序代码。它们是同一Web应用程序的两个临时实例。 B 是另一个网络应用程序。

我们需要执行从 A Web应用程序到 B 应用程序的跨域AJAX请求。我们尝试启用CORS但很难在IE< = 8中令人满意地工作,所以现在我们使用的是nginx代理规则。因此,流程是:浏览器ajax请求 - > A1 A2 - > nginx proxied - >的

B 是有状态的,需要用户的会话cookie才能运行。

我们看到的是,当使用服务器 A1 时,此功能正常,但使用服务器 A2 时, B 无法提取出饼干。

我查看了来自 A1 A2 的请求的标题,它们是相同的。两者都在标题中有cookie行,两者都有相同的来源等。

B 上,我们看到$ _COOKIE ['session_key']在请求来自 A2 时为空,但在请求来自 A1 即可。

奇怪的是,它只是缺少从标题中的cookie中提取一个特定的cookie密钥,并且只有当请求来自 A2 时才会丢失。它从 A2 中解析标题中的所有其他Cookie,由于某种原因它无法解析用户的会话cookie但如果请求来自 A1 ,它就可以了。

我已经使用了tcpdump并使用了每个的pcaps并对它们进行了区分,并且标题中没有任何内容看起来特别不同。

我发现这个Stack Overflow问题并且人们说这是因为他的cookie标题字符串太长了:What could cause cookie to not be set in $_COOKIE when it's in $_SERVER我不认为这太长了,因为我的成功和失败只有249个字符长情况下。

我正在考虑从$ _SERVER中删除cookie并手动解析它们,但这听起来很愚蠢,我更愿意找出根本问题。

4 个答案:

答案 0 :(得分:0)

使用IE< = 8时的一个问题是P3P。我发现将P3P标题放入接受AJAX / JSON请求的页面(实例中的服务器B)将解决此问题:

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

至于server A2未向$_COOKIE发送server B个请求,我建议您使用_GET将请求发送到initserver Bserver B 1}}。这样它就可以被处理,并存储在server B上。然后,对于必须存在此信息的所有其余页面,您可以查看_GET以确定信息是否已发送,或者将{{1}}数据连续发送到每个页面并将其与已有信息进行比较手上。提醒一下,应严格监控此信息,因为它更容易修改。

我道歉,我意识到这不能解决问题,但可以提供替代解决方案。

答案 1 :(得分:0)

PHP在这里没有错。

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

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

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

答案 2 :(得分:0)

前段时间,我不得不做跨域ajax请求。显然,当我尝试使用IE设置标题“允许x-domain ajax”(不记得标题名称)时,我遇到了同样的问题。

我做了这个排序,是在服务器的ajax之间使用CURL。因此,通过这种方式,我的ajax脚本(用PHP编写)能够通过JSON + CURL通过服务器交换数据,通过CURL POST发送数据,并通过CURL GET重新获取数据,无论涉及哪些域。 / p>

请原谅,也许这不是您需要的答案,但是,IMO,这可以帮助寻找跨站点ajax的人。

答案 3 :(得分:0)

在服务器之间使用GET;就这样。并构建一种散列get的方法,以便在服务器无法完成请求时,用户看不到实际的cookie内容被拉出