2010-01-21 205 views
4

我很困惑这一个......我正在做一个远程widgety类型的设置,我们将控制这两个域,所以安全不是一个问题。我使用jsonp来允许跨域Ajax请求。跨域AJAX和PHP会话

的访问的网站是domain1.com,其中inclues:

<script src="domain2.com/file.js"></script> 

file.js用了jQuery使Ajax请求:

$.ajax({ 
    url: 'http://domain2.com/getdata', 
    dataType: 'jsonp', 
    success: function(response) { 
     div.html(response); 
    } 
}); 

它要经过几个这些步骤在一定程度上的向导,使用来自远程服务器的html重新加载div。

我遇到的问题是,在每个ajax请求,我得到一个新的PHP会话ID和我的会话数据消失。事情的PHP结束是好的,如果我从同一个域运行相同的脚本(仍然使用jsonp),一切正常。然而,从远程域执行它,并且会话不会停留。我不知道这是为什么,PHP的最终目标是设置并从它自己的域请求一个cookie。我不需要从JS访问cookie。 Cookie正在写入并保存在服务器上。但是,当我检查浏览器中存储的cookie时,每个请求都会改变会话ID。

任何想法?

+0

您是否尝试了其他浏览器? – woody993 2010-01-21 01:00:17

回答

0

将ajax jsonp请求指向同一个域中的php文件,并在该php文件中执行cUrl,将请求发送到第二个域。

总之,使用PHP文件作为两个域之间的隧道(卷曲只是一个例子)

+0

然后使用服务器带宽,而不是客户端 – woody993 2010-01-21 00:56:19

+0

他没有提到一个带宽问题;)这是唯一的方式来在输出上有某种控制,然后打印到浏览器 – Strae 2010-01-21 08:05:46

2

好吧,我创建了一个非常简单的测试案例和它的工作就好了。

实际的应用程序正在使用cakephp和他们的会话。我试着切换到只使用$ _SESSION,没有奏效。我尝试将session_start()添加到控制器,但没有奏效。最后,我禁用了配置中的cakephp会话,现在它工作得很好。

我不知道为什么它不起作用,但似乎是cakephp的一个小故障。

+1

最终找到修复。在蛋糕中,我必须将Session.security设置为中等。在高度安全性上,每个请求都会生成一个新的会话ID以防止会话劫持。由于我无法理解的原因,跨域Ajax请求似乎没有拿起新的cookie会话ID,而正常的AJAX没有...... – Chad 2010-01-21 17:46:44

0

对不起,我没有读到您使用的是jsonp。因此,这不是解决方案...

使用Javascript,您无法对与您的网站运行的域不同的域进行AJAX调用。 这就是所谓的相同来源策略,并且在您的网站上存在XSS问题的情况下提供更高的安全性。 请参阅Wikipedia文章以获取更多信息:http://en.wikipedia.org/wiki/Same_origin_policy 通过在您的服务器上提供路由php脚本,您可以将通过您的服务器的这些Javascript AJAX调用路由到目标域/服务/任何地方。