2012-04-27 20 views
6

Sto utilizzando la funzione getLoginUrl() di PHP SDK che funziona perfettamente per accedere all'utente. Una volta che l'utente viene reindirizzato alla mia pagina, l'URL può venire in due forme, vedere nel seguente link sottosezione 3: http://developers.facebook.com/docs/authentication/server-side/Facebook PHP SDK - getLoginUrl() - valore di stato

Parte dell'URL di ritorno è uno stato? valore =. Questo valore dovrebbe essere usato per prevenire Cross Site Request Forgery: http://developers.facebook.com/docs/reference/dialogs/oauth/

Anche se, utilizzando il metodo getLoginUrl() non riesco mai a impostare un valore di stato in quanto non è uno dei parametri: http://developers.facebook.com/docs/reference/php/facebook-getLoginUrl/

Così come posso utilizzare il valore di stato per registrare un utente su Facebook e prevenire CSRF?

+0

Me lo chiedo anche questo. Qualcosa che sto facendo ora è qualcosa del genere: (Sono sicuro che ci sia un modo migliore più corretto) '$ loginUrl = $ facebook-> getLoginUrl (array ('scope' => 'email', 'redirect_uri' => FACEBOOK_REDIRECT_URL)); $ _SESSION ['state'] = $ _SESSION ['fb _'. FACEBOOK_APP_ID .'_ stato ']; '. Quindi, quando si effettua l'autenticazione dopo il reindirizzamento al proprio sito: 'if ($ _ SESSION ['state'] == $ _REQUEST ['state']) {// non CSRF}' – uguMark

risposta

3

Quindi, come posso utilizzare il valore di stato per registrare un utente su Facebook e impedire CSRF?

questo viene automaticamente gestito dal Facebook PHP SDK. Se stavi per scrivere le tue chiamate APIsu Facebook, dovresti inviare lo state manualmente (se lo desideri) come da documentazione di Facebook OAuth.

Quando si crea un URL di accesso con BaseFacebook::getLoginUrl(), la prima cosa che la funzione non è quello di stabilire CSRF stato gettone , che crea un hash utilizzando core di PHP mt_rand(), uniqid() e md5() funzioni e anche memorizza il valore come una sessione variabile.

Quando l'utente viene reindirizzato alla pagina, FBSDK controlla se il valore state inviato corrisponde al valore state nella sessione. Se i valori corrispondono effettivamente, state viene cancellato dall'oggetto Facebook e dalla sessione, quindi tutte le successive richieste getLoginUrl() riceveranno una nuova variabile state.

Teoricamente è possibile utilizzare il proprio valore state con FBSDK scrivendo a fb_<your_app_id>_state variabile di sessione prima di costruire il Facebook -oggetto, come costruttore di 's il BaseFacebook e establishCSRFTokenState() sia verificare se il state esiste già nella sessione.

Ma questo probabilmente introdurrebbe più complessità del necessario.

 


  1. vedere BaseFacebook::establishCSRFTokenState()
  2. vedere BaseFacebook::getCode()
Problemi correlati