2012-04-27 3 views
6

Estoy usando la función getLoginUrl() de PHP SDK que funciona perfectamente para iniciar sesión en el usuario. Una vez que el usuario es redirigido a mi página, la URL puede venir en dos formas: ver en el siguiente enlace subsección 3: http://developers.facebook.com/docs/authentication/server-side/Facebook PHP SDK - getLoginUrl() - valor de estado

Parte de la URL de retorno es a? state = value. Se supone que este valor se utiliza para evitar el Cross Site Request Falsificación: http://developers.facebook.com/docs/reference/dialogs/oauth/

Sin embargo, utilizando el método getLoginUrl() nunca puede establecer un valor de estado ya que no es uno de los parámetros: http://developers.facebook.com/docs/reference/php/facebook-getLoginUrl/

Entonces, ¿cómo ¿Puedo utilizar el valor de estado para registrar a un usuario en Facebook y prevenir CSRF?

+0

Me he estado preguntando esto también. Algo que estoy haciendo ahora es algo así: (estoy seguro de que hay una forma mejor y más correcta) '$ loginUrl = $ facebook-> getLoginUrl (array ('scope' => 'email', 'redirect_uri' => FACEBOOK_REDIRECT_URL)); $ _SESSION ['state'] = $ _SESSION ['fb _'. FACEBOOK_APP_ID .'_ state ']; '. Luego, al autenticarse después de la redirección a su sitio: 'if ($ _ SESSION ['state'] == $ _REQUEST ['state']) {// not CSRF}' – uguMark

Respuesta

3

Entonces, ¿cómo puedo utilizar el valor de estado para registrar a un usuario en Facebook y prevenir CSRF?

Esto se está manejando automáticamente por el Facebook PHP SDK. Si estuvieras a punto de escribir tus llamadas a la API en Facebook, necesitarías enviar el state manualmente (si lo deseas) según la documentación de Facebook OAuth.

Cuando se crea una URL de inicio de sesión con BaseFacebook::getLoginUrl(), lo primero que la función hace es establecer CSRF estado símbolo , lo que genera un hash utilizando el núcleo de PHP mt_rand(), uniqid() y md5() funciones y también almacena el valor como una sesión variable.

Cuando el usuario es redirigido a su página, FBSDK comprueba si el state presentado coincide con el valor de state en la sesión. Si los valores coinciden, el state se borra del objeto Facebook y de la sesión, por lo que todas las solicitudes posteriores getLoginUrl() obtendrían una nueva variable state.

En teoría se podría usar su propio valor state con FBSDK escribiéndolo a fb_<your_app_id>_state variable de sesión antes de construir el -objeto Facebook, como constructor de la BaseFacebook 's y establishCSRFTokenState() tanto comprobar si el state ya existe en la sesión.

Pero eso probablemente introduciría más complejidad de la necesaria.

 


  1. ver BaseFacebook::establishCSRFTokenState()
  2. ver BaseFacebook::getCode()
Cuestiones relacionadas