PHP session 跨域 登入
現在有兩個伺服器
a:www.test1.com
b:www.test2.com
我想在test1裡面進行登入,然後在test2裡面也同樣進行登入,請問這個該怎麼寫?
我有部分測試代碼如下
在test1登入的時候,如果登入成功那麼就執行下面
$fp = pfsockopen("www.test2.com",80,$errorno,$errormsh);//串連伺服器if ($fp){ $out = "GET /login.php?acc=".$acc."&psw=".$psw." HTTP/1.1\r\n"; $out.= "Host:www.test2.com\r\n"; $out.= "Connection: Close\r\n\r\n"; fputs($fp, $out); fclose($fp); }
然後在www.test2.com裡面的login.php檔案
$acc = $_GET['acc'];$psw = $_GET['psw'];$_SESSION['acc'] = $acc;$_SESSION['psw'] = $psw;
然後我訪問www.test2.com
發現session為空白啊
求高手指教!
回複討論(解決方案)
如果單點登入這麼容易搞得話,那些 SSO 服務商不都要倒閉了?
session 依靠 cookie 攜帶的 sessionid 做唯一性識別
而正常的 cookie 是不能跨域的。雖然利用一些技術手段可以實現 cookie 跨域,但這畢竟是利用了規則上的漏洞,並不可取。
我們知道,如果一個網站有設定了失效期的 cookie 的話,當瀏覽結束時就會在瀏覽器緩衝區留下一個以該網站網域名稱的 cookie 檔案。當再次訪問該網站時,這個上次儲存的 cookie 就會被發送回去
因此,你只要在訪問 www.test1.com 的時候,設法留下一個 www.test2.com 的 cookie 檔案
那麼你再訪問 www.test2.com 的時候就能實現同步了
怎麼留?在 www.test1.com 返回的頁面中用 iframe 或 js 訪問一下 www.test2.com 的特定檔案
當然,這隻是基礎,需要考慮的問題遠不止這點
如果單點登入這麼容易搞得話,那些 SSO 服務商不都要倒閉了?
session 依靠 cookie 攜帶的 sessionid 做唯一性識別
而正常的 cookie 是不能跨域的。雖然利用一些技術手段可以實現 cookie 跨域,但這畢竟是利用了規則上的漏洞,並不可取。
我們知道,如果一個網站有設定了失效期的 cookie 的話,當瀏覽結束時就會在瀏覽器緩衝區留下一個以該網站網域名稱的 cookie 檔案。當再次訪問該網站時,這個上次儲存的 cookie 就會被發送回去
因此,你只要在訪問 www.test1.com 的時候,設法留下一個 www.test2.com 的 cookie 檔案
那麼你再訪問 www.test2.com 的時候就能實現同步了
怎麼留?在 www.test1.com 返回的頁面中用 iframe 或 js 訪問一下 www.test2.com 的特定檔案
當然,這隻是基礎,需要考慮的問題遠不止這點
那請問老大,我這樣處理行不行
在www.test2.com裡面的login.php檔案裡面寫上建立cookie的代碼
setcookie("acc",$acc,time()+3600,'/');
這樣,是不是在我訪問www.test2.com的時候這個cookie會直接發送頁面
然後我在訪問的時候加上一個對cookie的判斷是否就行了?
只要 www.test2.com/login.php 是在 www.test1.com 返回的頁面 裡面調用的就可以
就是說你在訪問 www.test1.com 的同時也訪問了 www.test2.com
這樣 www.test1.com 的 cookie 供訪問 www.test1.com 用
www.test2.com 的 cookie 供訪問 www.test2.com 用
只要 www.test2.com/login.php 是在 www.test1.com 返回的頁面 裡面調用的就可以
就是說你在訪問 www.test1.com 的同時也訪問了 www.test2.com
這樣 www.test1.com 的 cookie 供訪問 www.test1.com 用
www.test2.com 的 cookie 供訪問 www.test2.com 用
怎麼樣才叫做在返回的頁面裡面調用?
www.test1.com裡面index.php
使用登入成功之後訪問www.test2.com的方法,這個算不算是調用了!
實際情況是這樣
www.test1.com裡面login.php裡面登入成功之後使用,
$fp = pfsockopen("www.test2.com",80,$errorno,$errormsh);//串連伺服器 if ($fp){ $out = "GET /login.php?acc=".$acc."&psw=".$psw." HTTP/1.1\r\n"; $out.= "Host:www.test2.com\r\n"; $out.= "Connection: Close\r\n\r\n"; fputs($fp, $out); fclose($fp); }
然後後面就直接跳轉會www.test1.com裡面index.php頁面了
www.test2.com裡面login.php中就寫上了cookie
setcookie("acc",$acc,time()+3600,"/");//寫檔案,查看是否訪問以及寫入cookie成功$fp = fopen("test.txt","w");fwrite($fp,"acc:".$_COOKIE['acc']);fclose($fp);
我剛才測試了一下,發現test.txt檔案存在,裡面也有資料
然後我就去訪問www.test2.com
在頁面上加入了var_export($_COOKIE);
打出來的資料並沒有我寫入的東西,為什嗎?
這樣算不算老大你剛才說的“在 www.test1.com 返回的頁面裡面調用”
“在 www.test1.com 返回的頁面裡面調用”是指請求是從瀏覽器發出的,這樣返回的 cookie 才會被瀏覽器儲存
“在 www.test1.com 返回的頁面裡面調用”是指請求是從瀏覽器發出的,這樣返回的 cookie 才會被瀏覽器儲存
echo "";
我在登入之後是用來這樣的
別的不動,結果cookie還不沒有我寫入的資料,而且檔案都建立不出來了,是不是我太笨了?
這寫錯了?還是應該用別的方法,求老大指教!
把session單獨存入資料庫或者memcache之類的”記憶體資料庫”中,然後各個網站讀取的時候全部從session 資料庫中擷取
把session單獨存入資料庫或者memcache之類的”記憶體資料庫”中,然後各個網站讀取的時候全部從session 資料庫中擷取
簡單明了。大版有什麼高見呢。。