2012-04-27 12 views
6

私はPHPのgetLoginUrl()関数を使用してユーザをログインさせています。ユーザーが私のページにリダイレクトされると、URLは2つの形式になります。次のリンクサブセクション3を参照してください。http://developers.facebook.com/docs/authentication/server-side/PHPのgetLoginUrl() - 状態の値

戻り値の一部は?state = valueです。 http://developers.facebook.com/docs/reference/php/facebook-getLoginUrl/

それでは、どのように:それはパラメータの一つではないと私は状態の値を設定することはできませんgetLoginUrl()メソッドを使用して、http://developers.facebook.com/docs/reference/dialogs/oauth/

けれども:この値は、クロスサイトリクエストフォージェリを防止するために使用されることになっています私はstate-valueを利用してユーザーをfacebookにログインさせ、CSRFを防ぐことができますか?

+0

を参照してください参照してください。私が今やっていることは次のようなものです:$ loginUrl = $ facebook-> getLoginUrl(array( 'scope' => 'email'、 'redirect_uri' => FACEBOOK_REDIRECT_URL )); $ _SESSION ['state'] = $ _SESSION ['fb _'。FACEBOOK_APP_ID。 '_状態']; '。次に、あなたのサイトにリダイレクトした後に認証するとき、 'if($ _ SESSION ['state'] == $ _REQUEST ['state']){// not CSRF}' – uguMark

答えて

3

どのように私はstate-valueを利用してユーザーをfacebookにログインさせ、CSRFを防ぐことができますか?

これは自動的にFacebookのPHP SDKによって処理されています。 自身の APIコールをFacebookに書き込む場合は、stateを手動で送信する必要があります(必要に応じて)FacebookのOAuthドキュメントを参照してください。

あなたはBaseFacebook::getLoginUrl()でログインURLを作成すると、機能が最初に行うことは、PHPのコアmt_rand()uniqid()md5()機能を使用してハッシュを作成し、またセッションとして値を格納するCSRFトークン状態を確立することです変数。

ユーザーがページにリダイレクトされると、FBSDKは、送信されたstateがセッションのstateの値と一致するかどうかを確認します。値が実際に一致した場合、はFacebookオブジェクトとセッションから消去されます。したがって、その後のすべてのgetLoginUrl()要求は新しいstate変数を取得します。

理論的にあなたはstateがすでに存在する場合は、両方のチェックBaseFacebookのコンストラクタとして、Facebook -objectを構築する前に、fb_<your_app_id>_stateセッション変数にそれを書き込むことによってFBSDKを使用して独自のstate値を使用してestablishCSRFTokenState()できセッション。

しかし、それはおそらく、必要以上に複雑さをもたらすでしょう。

 


  1. BaseFacebook::establishCSRFTokenState()
  2. は私もこれを思ってきたBaseFacebook::getCode()
関連する問題