2010-01-21 470 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調用路由到目標域/服務/任何地方。