2011-02-05 46 views
7

我想在用戶在PHP中註冊後,從一個域創建一個cookie。並使該Cookie可訪問其他4個不屬於子域的域。我知道cookies並非設計爲可供其他域訪問。例如,我從域www.firstdomain.com設置了Cookie變量$ user_email,並希望在www.seconddomain.com,www.thirddomain.com等其他域中訪問它。可以使用PHP或JavaScript完成此操作。請任何想法。針對多個域名的PHP Cookie

謝謝!

回答

6

正如您所說的,只能爲來自該域(包括其子域)的域設置cookie。如果您的域名不共享超級域名,則需要分別爲每個域名設置每個Cookie。

您可以使用腳本在每個爲您設置cookie的域上執行此操作。但請確保對這些腳本的請求進行身份驗證,以便只有您可以設置Cookie。如果你想不同的領域內訪問的cookie所以這可以用JavaScript技巧的幫助下完成

https://code.google.com/p/mudoco/

1

我已經解決了完全相同的問題(實際上也適用於4個域)。我想出的唯一解決方案是,在'成功登錄頁面'中包含3個隱藏的iframe,這些iframe只加載www.domain1.com/register_session.php,www.domain2.com/register_session.php等。 ...

至於register_session.php參數我用「SID」,這包含會話ID:

session_id($_GET['sid']); 
session_start(); 

這實際上是保持會話的存活在所有這些領域,但同樣會爲你的情況與餅乾。

+0

或者,您可以通過[CORS]創建一個跨源AJAX請求(http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross -origin-resource-sharing /)來跨域傳遞信息。 – 2011-02-05 13:15:25

9

當搜索 有效餅乾Cookie列表中,cookie是 從該網址將成爲 牽強 主機互聯網域名所作出的 域屬性的比較。如果存在尾部匹配,則 則該cookie將通過匹配的路徑 查看是否應該發送。 「尾部匹配」表示將域 屬性與主機的完全限定域名 的尾部 進行匹配。 「acme.com」的域屬性爲 將與主機名 「anvil.acme.com」以及 「shipping.crate.acme.com」匹配。只有在指定域中的主機 可以爲某個域設置一個 Cookie,並且域必須至少有兩個(2)或三個(3) 週期以防止域名爲「.com」,「。 edu「和」va.us「。 任何在 之一內失敗的域名,下面列出的七個特殊頂級域名 只需要兩個句點。 其他域名至少需要 三。七個特殊頂級域名爲:「COM」,「EDU」,「NET」, 「ORG」,「GOV」,「MIL」和「INT」。

域的默認值是 生成cookie響應的服務器的主機名。

閱讀here

您可以從主機加載iframe,然後使用編碼後的cookie值(在#後面)重新加載自身。

然後,您可以從父窗口訪問document.location屬性(命中唯一可訪問的內容)。解碼並將其傳遞給服務器,執行ajax請求。

這看起來可能如此。

xss.php(位於cookies.example。com):

<?php 
$data = array(
'uid' => $_COOKIE['uid'], 
'loginhash' => $_COOKIE['loginhash']); 
header('Location: xss.php#'.urlencode(json_encode($data))); 

對於這種特殊情況它不需要是hashtag!它只適合其他情況。這也可以在JavaScript中完成。

其他網站嵌入xss.php:

<iframe id="cookies" src="http://cookies.example.com/xss.php"></iframe> 

you need to somehow delay the following of do it in a loop that stops after 5 seconds or something. 

if(document.getElementById('cookies').location != 'http://cookies.example.com/xss.php') { 
// read location, extract hashtag, json decode using javscript, there you have your user. send it to server for validation or whatever. 
} 

這teqnique被稱爲XSS recieving。例如它被所有的javascript連接庫用於facebook。

一個可能更好的方法是像openid這樣的令牌交換協議。

亞馬遜也使用它。

您可以設置一個openid提供程序(有可用的librarys可以實現此功能),並將其設置爲在沒有用戶交互的情況下自動重定向。我經常看到openid協議用於其他用途,就像跨域通信一樣。

+0

你可以編輯你的答案(也許給一個樣本代碼),所以我可以重新upvote你?我意外地解開了我的贊同。 – 2011-02-05 13:16:56

+0

快來吧。 – 2011-02-05 13:19:20

+0

我認爲它可以用更優雅的方式完成,但原理保持不變 – 2011-02-05 13:29:27

1

我已經做了一些腳本來處理多域cookie。由於cookie可以在同一個域內訪問。

  1. 在您的第一個域上使用JavaScript在用戶瀏覽器上創建cookie。

  2. 通過使用window.name,將窗口的名稱設置爲要攜帶到另一個域的cookie的任何值。

  3. 步驟2應該在創建cookie的域的每個頁面上執行。可以通過在所有頁面上調用JavaScript文件輕鬆完成。

  4. 當你移動到另一個域,並且想要訪問上面提到的cookie值時,使用window.name作爲window沒有改變。

  5. 在此域上創建新cookie並將此值賦予它。

0