PHP實現跨域自動登入
很多時候多個域名共用了同一組使用者資料,往往也想當其中的一個域名登入後可以快捷的進行另幾個域名下自動登入而不用使用者再登入一次。
大至可以分為兩種情況:一種是一級域名相同,只是二級域名不同如 test.php.com 和 login.php.com。另一種是域名一級域名不相同如 test.php.com 和 t.html.com。對於一級域名相同的基本上可以在寫COOKIE時只寫到一級域名就可以,這樣其它的同一級域名可以直接的訪問這個COOKIE資料,但如果一級域名不相同那就沒有辦法直接訪問(至少現在不能)。在這裡只說那種一級域名不相同的時候應該怎樣去處理。
PHP組成的網站可以接收客戶端,資料庫,記憶體快取,檔案等的資料來作出不同的反映。有的時候需要對不同的使用者操作做獨立後期服務時,就得區分使用者,能區分的方法就是給使用者做標識,使用者標識必須在享受獨立服務前與伺服器建立會話,登入就是建立獨立會話的開始。登入作為使用者個人標識,同時為使用者提供一個規劃好的獨立空間,允許使用者在這個空間裡獨立享受服務,所以又引來使用者標識安全問題。要想能相對準確的知道使用者的身份,只能由客戶來操作才能做到這點,當前識別的方式多為使用者名稱加密碼外加驗證碼,使用者登入是一個敏感操作,在資料安全方面是一個網站的基本。所以只要能找到一個好的傳送自動登入資料到目標網站就可以完成自動登入的目的。很多人也都在為這個問題而頭疼,如何傳送?。
想想網上支付系統我們可以得出相仿的模式,因為大部分支付系統都是在自己的平臺上完成支付操作,對外提供一個連線支付接囗。這是一個典型的兩個不同的域名之間登入驗證使用者標識的架構,但它們之間的資料互動方式又有多種。但我們只要一點就可以完成一個相對安全的方法(驗證金鑰)。登入與自動登入都必須通過客戶端才相對準確,尤其是不同域名且伺服器也不同,完成的思路可以定為:使用者先登入 --> 使用者操作要進入另一個網站(但沒有立刻進入另一個網站而是請求當前網站的一個跳轉處理地址) --> 跳轉處先判斷使用者的合法性(以合法為例) --> 提取使用者名稱與ID外加驗證金鑰(金鑰可以自己定義也可以直接MD5)組成的連線用header跳轉到目標網站 --> 目標網站判斷提交過來的資料(合法就建立登入資料生成會話) --> 跳轉到目標網站指定的頁面。
在這整個處理過程中最重要的是安全問題,這個URL會不會非法生成或獲取從而給網站無形的建立了一個漏洞,這個問題就如果放在網上支付系統上那網上支付可能很難再進行下去了。這種跨域操作用的最多的是驗證串,如果說你的驗證機制做的好那麼別人就很難建立URL進行漏洞***。支付系統就是如此,當前基本上所有的支付接囗都提供了一個接囗包,而這個包中就有驗證串處理機制。為了讓這個機制不讓你懂了其的加密方法就可以解密或生成,從而引出了金鑰或商戶名這兩個附加串,它是整個安全的核心,如果這個資料被別人知道了那就麻煩了(如果你認為有的支付接囗還會判斷IP或域名很安全,其實這些資料中是相對安全),只要這兩組附加串沒有被洩漏那麼想破解就沒有那麼簡單,當然如果你非要去爆力破解(只能說明你的時間太多了!)。
網站的安全沒有絕對的,但我們要盡力讓它相對安全。對於跨域登入的方法雖然不只這一種但基本的思想一樣,那就是獲取當前的使用者資訊傳給目標網站由目標網站判斷合法性再建立會話。
上面的例子只是針對不同域和不同的伺服器(不共用資料)時的一種方法,如果資料庫是共用的(主從模式複製資料庫管理方式除外)那麼這個附加串就可以寫在資料庫中並且為每個使用者生成不同的隨機附加串來提高安全性!
如果想指定進入目標網站的地址,我想只要現多加一個引數傳入就OK了!
注:以上的程式碼沒有作安全過濾處理,故不能直接用!
如果有客戶端應用,另論!
個人技術有限,如有不當還請指正!
轉載於:https://blog.51cto.com/php2012web/1308407