2012-04-27 69 views
6

我正在使用PHP SDK的getLoginUrl()函數,該函數完美地將用戶登錄進來。一旦用戶重定向回到我的頁面,URL可以有兩種形式,請參閱以下鏈接小節3:http://developers.facebook.com/docs/authentication/server-side/Facebook PHP SDK - getLoginUrl() - 狀態值

返回URL的一部分是?state = value。這個值應該是用來防止跨站請求僞造:http://developers.facebook.com/docs/reference/dialogs/oauth/

雖然使用getLoginUrl()方法,我永遠不能設定的狀態值,因爲它不是一個參數:http://developers.facebook.com/docs/reference/php/facebook-getLoginUrl/

那麼如何我可以利用狀態值將用戶登錄到Facebook並防止CSRF?

+0

我一直想知道這一點。我現在正在做的事情是這樣的:(我相信這是更好的更正確的方式)'$ loginUrl = $ facebook-> getLoginUrl(array('scope'=>'email','redirect_uri'=> FACEBOOK_REDIRECT_URL )); $ _SESSION ['state'] = $ _SESSION ['fb _'。FACEBOOK_APP_ID。'_ state'];'。然後,當重定向到您的網站後進行身份驗證時:'if($ _ SESSION ['state'] == $ _REQUEST ['state']){// not CSRF}' – uguMark 2012-05-09 10:07:20

回答

3

那麼如何利用狀態值將用戶登錄到Facebook並防止CSRF呢?

這是由Facebook PHP SDK自動處理。如果您要將自己的自己的 API調用寫入Facebook,則需要根據Facebook的OAuth文檔手動提交state(如果需要)。

當你創建BaseFacebook::getLoginUrl()登錄網址,該函數所做的第一件事就是使用PHP的核心mt_rand()uniqid()md5()功能建立CSRF令牌狀態,它創建了一個哈希並存儲的值作爲會話變量。

當用戶重定向回您的頁面時,FBSDK檢查提交的state是否與會話中的state值相匹配。如果值確實匹配,則從Facebook對象和會話中清除state,因此所有後續的getLoginUrl()請求都將獲得新的state變量。

理論上你可以通過構建Facebook -object之前將其寫入fb_<your_app_id>_state會話變量使用自己的state值與FBSDK,爲BaseFacebook的構造和establishCSRFTokenState()都檢查state在已經存在會話。

但是這可能會帶來更多的複雜性。

 


  1. 看到BaseFacebook::establishCSRFTokenState()
  2. 看到BaseFacebook::getCode()