Video

Desde la conferencia F8 de 2015, Jonathan Gross y Brent Dorman buscan maneras de aumentar la seguridad de tu integración de inicio de sesión con Facebook.

Lista de comprobación de seguridad

En la siguiente lista, se muestran las medidas de seguridad mínimas necesarias que deben implementar todas las apps que utilizan el inicio de sesión con Facebook. Otras funciones serán exclusivas de tu app y deberás pensar siempre en cómo hacer para que tu app sea lo más segura posible. Las apps que no son seguras perderán la confianza del público y las personas dejarán de usarlas.

Nunca incluyas la clave secreta de la app en el cliente o en el código descompilable.

Firma todas las llamadas a la API Graph de servidor a servidor con tu clave secreta de la app.

Usa tokens a corto plazo únicos en los clientes.

No confíes en que los tokens de acceso utilizados por tu app fueron realmente generados por tu app.

Usa el parámetro state cuando uses el cuadro de diálogo de inicio de sesión.

Usa nuestros SDK oficiales siempre que sea posible.

Reduce la superficie de ataque de tu app. Para ello, bloquea la configuración de tu app de Facebook.

Usa HTTPS.

Clave secreta de la app

La clave secreta de la app se utiliza en algunos de los flujos de inicio de sesión para generar tokens de acceso y está destinada a garantizar el uso de tu app solo por parte de usuarios de confianza. La clave secreta se puede usar para crear con facilidad un token de acceso a la app que puede hacer solicitudes a la API en nombre de cualquier usuario de la app. Por eso, es muy importante que la clave secreta esté protegida.

Por lo tanto, nunca se debería incluir la clave secreta de la app ni un token de acceso a la app en ningún código.

Te recomendamos usar los tokens de acceso a la app solo directamente desde los servidores de tu app para brindar la mayor seguridad. Para las apps nativas, te sugerimos que la app se comunique con tu propio servidor y que el servidor luego haga las solicitudes a la API de Facebook con el token de acceso a la app. Por este motivo, si la opción "Tipo de app" de "Configuración avanzada" del panel de apps está configurada en Native/Desktop, suponemos que tu app nativa contiene la clave secreta o un token de acceso a la app en la información binaria, y no permitimos que procedan las llamadas firmadas con un token de acceso a la app. La API se comportará como si no se hubiera proporcionado ningún token de acceso.

Llamadas del lado del servidor protegidas con appsecret_proof

Para reducir tu exposición al malware y los spammers, puedes requerir que las llamadas de servidor a servidor a la API de Facebook estén firmadas con el parámetro appsecret_proof. La prueba de la clave secreta de la app es un hash SHA256 de tu token de acceso, que utiliza la clave secreta de la app como clave. La clave secreta de la app se puede encontrar en el panel de apps, en Configuración > Básica.

Generar la prueba

El siguiente ejemplo de código muestra cómo se ve la llamada en PHP:

$appsecret_proof= hash_hmac('sha256', $access_token.'|'.time(), $app_secret); 

Algunos sistemas operativos y lenguajes de programación devolverán una marca de tiempo con un valor flotante. Asegúrate de convertir el valor a un número entero antes de calcular la prueba de la clave secreta de la app. Algunos lenguajes de programación crean el hash como objeto "digest". Asegúrate de expresar el hash como objeto hexadecimal.

Agregar la prueba

En cada llamada que realices, agrega el resultado como un parámetro appsecret_proof con el appsecret_time configurado en la marca de tiempo que utilizaste cuando cifraste la clave secreta de la app:

curl \
  -F 'access_token=ACCESS-TOKEN' \
  -F 'appsecret_proof=APP-SECRET-PROOF' \
  -F 'appsecret_time=APP-SECRET-TIME' \
  -F 'batch=[{"method":"GET", "relative_url":"me"},{"method":"GET", "relative_url":"me/accounts"}]' \
  https://graph.facebook.com

Las pruebas de clave secreta de la app se considerarán caducadas luego de cinco minutos, de modo que te recomendamos que generes una nueva prueba cada vez que realices una llamada a la API Graph.

Exigir la prueba

En la sección Configuración > Avanzada del panel de apps de la sección Seguridad, se activa Requerir clave secreta de la app. Si se activa esta opción, solo permitiremos llamadas a la API que incluyan el parámetro appsecret_proof.

Proteger las llamadas del cliente con tokens a corto plazo y flujo de código

En algunas configuraciones, las apps reutilizan un token a largo plazo en varios clientes. No hagas esto. En su lugar, usa tokens a corto plazo generados con el flujo de código, como se describe en nuestra documentación sobre tokens de acceso.

Secuestro de tokens

Para comprender cómo sucede esto, imagina una app nativa de iOS que quiere hacer llamadas a la API, pero en lugar de hacerlo directamente, se comunica con un servidor propiedad de la misma app y pasa al servidor un token generado con el SDK de iOS. El servidor usará entonces el token para hacer llamadas a la API.

El punto de conexión que usa el servidor para recibir el token podría ser vulnerado y otras personas podrían pasar tokens de acceso para apps completamente diferentes. Obviamente, esto sería inseguro, pero hay una manera de protegerse: nunca se debe suponer que los tokens de acceso provienen de la app que los está usando, sino que es necesario revisarlos con los puntos de conexión de depuración.

Verificación periódica de la validez del token de acceso

Si no utilizas los SDK de Facebook, verifica regularmente si el token de acceso es válido. Si bien los tokens de acceso tienen una caducidad programada, es posible hacer que caduquen de manera anticipada por motivos relacionados con la seguridad. Si no utilizas los SDK de Facebook en tu app, es muy importante que implementes manualmente controles frecuentes (como mínimo, diarios) de la validez del token con el objetivo de asegurarte de que tu app no utilice un token que haya caducado por motivos relacionados con la seguridad.

Parámetro state

Si estás usando el cuadro de diálogo de inicio de sesión con Facebook en tu sitio web, el parámetro state es una cadena única que protege tu app contra ataques de falsificación de solicitudes entre sitios.

Activación del modo estricto

El modo estricto evita que personas malintencionadas secuestren tu redireccionamiento, lo que contribuye a la seguridad de las apps. La activación del modo estricto es obligatoria para todas las apps.

Antes de activar el modo estricto en el panel de apps, asegúrate de que el tráfico de redireccionamiento actual aún funcione. Para ello, realiza las siguientes acciones en la configuración de inicio de sesión con Facebook:

  • Si se trata de apps con URI de redireccionamiento dinámico, usa el parámetro state a fin de devolver la información dinámica a un número limitado de URI de redireccionamiento. Luego, agrega cada una de las URI de redireccionamiento limitado a la lista de URI de redireccionamiento de OAuth válidas.

  • Si se trata de apps con un número limitado de URI de redireccionamiento, agrega cada una a la lista de URI de redireccionamiento de OAuth válidas.

  • En el caso de las apps que usan solo Facebook SDK para JavaScript, el tráfico de redireccionamiento ya está protegido. No necesitas hacer nada más.

Después de realizar estas acciones, asegúrate de activar el modo estricto.

Cómo funciona el modo estricto

El modo estricto exige una coincidencia exacta con tu lista de URI de redireccionamiento de OAuth válidas, lo que evita el secuestro de tus URI de redireccionamiento. Por ejemplo, si tu lista contiene www.ejemplo.com, el modo estricto no permitirá www.ejemplo.com/token como un redireccionamiento válido. Además, no permitirá parámetros de consulta adicionales que no estén presentes en tu lista de URI de redireccionamiento de OAuth válidas.

Uso de HTTPS

Usa HTTPS, en lugar de HTTP, como protocolo de Internet, ya que usa cifrado. HTTPS mantiene la privacidad de los datos transmitidos y protege contra los ataques de interceptación. Además, evita que se alteren los datos durante la transmisión, por ejemplo, mediante anuncios o código malicioso.

A partir del 6 de octubre de 2018, es obligatorio usar HTTPS en todas las apps.

Activar el SDK para JavaScript para el inicio de sesión con Facebook

Cuando configuras el inicio de sesión con el SDK de JavaScript en "yes" para indicar que usas el SDK de JavaScript para iniciar sesión, el dominio de la página que almacena el SDK debe coincidir con una de las entradas en la lista Dominios permitidos para el SDK para JavaScript. Esto permite que solo se devuelvan los tokens de acceso cuando se realizan devoluciones de llamas en dominios autorizados. Solo se admiten páginas HTTPS para las acciones de autenticación con el SDK de Facebook para JavaScript.

Para las integraciones de JSSDK actuales creadas hasta el 10 de agosto de 2021, esta lista se completará con valores en basados en el uso actual. No necesitas hacer nada más.

Para las nuevas integraciones que se creen luego del 10 de agosto de 2021, debes agregar los valores a la lista.

Si ves que el campo del dominio de JSSDK de la app empieza con *., reemplázalo por URL de dominio absoluto para mayor seguridad.

Cómo funciona la comprobación de URI de redireccionamiento

Los ataques de redireccionamiento abierto suceden cuando una persona malintencionada proporciona un parámetro "redirect_uri" no autorizado en la solicitud de inicio de sesión, lo que da lugar a que se filtre información confidencial, como un token de acceso, a través de la cadena de consulta o el fragmento del URI de redireccionamiento.

En el caso de las integraciones personalizadas de la web, debes proporcionar URI de redireccionamiento autorizados en la configuración de la app a fin de impedir esos ataques. Cuando se procese la solicitud de inicio de sesión, el parámetro "redirect_uri" se comparará con las entradas de esta lista. El URI completo debe coincidir exactamente, incluidos todos los parámetros, a excepción del parámetro opcional state, cuyo valor se ignora.

Navegadores en las apps y el SDK para JavaScript

El SDK para JavaScript generalmente usa ventanas emergentes y devoluciones de llamadas para completar el inicio de sesión. Esto puede no funcionar para algunos navegadores en las apps que suprimen las ventanas emergentes. En estas situaciones, el SDK intentará automáticamente redirigir al usuario, con un token de acceso, a la página que lo solicitó. Solo se puede hacer esto de forma segura si el URI completo de la página se encuentra en la lista "URI de redireccionamiento de OAuth válidos".

Si los escenarios de navegadores en las apps son importantes para tu app web, deberías agregar el dominio de la página de inicio de sesión a los dominios permitidos y, también, los URI completos (incluida la ruta y los parámetros de consulta) a los URI de redireccionamiento de OAuth válidos. Si los URI donde se produce el inicio de sesión en tu app tienen muchas variaciones, puedes especificar manualmente un parámetro "fallback_redirect_uri" como una opción en la llamada "FB.login()" para que solo tengas que agregar una única entrada a la lista de URI de redireccionamiento de OAuth válidos.

Bloqueo de la configuración de la app de Facebook

Activa o desactiva cualquier flujo de autenticación que la app no use para minimizar la superficie de ataque.

  • En los clientes, usa tokens de acceso a corto plazo generados por el código, en lugar de tokens generados por el cliente o tokens a largo plazo proporcionados por el servidor. El proceso de tokens de acceso a corto plazo generados por código requiere que el servidor de la app intercambie el código por un token, que es más seguro que obtener un token en el navegador. Recomendamos que las apps usen este proceso siempre que sea posible para ser más seguras: si una app solo activa este proceso, el malware que se ejecuta en la computadora de un usuario no podrá obtener un token de acceso para abuso. Si quieres obtener más información, consulta la documentación sobre tokens de acceso.

  • Desactiva el inicio de sesión de OAuth del cliente si tu app no lo usa. El inicio de sesión de OAuth del cliente es el medio global de activación y desactivación del uso de los flujos de token de cliente de OAuth. Si tu app no usa ningún flujo de OAuth de cliente, que incluye los SDK de inicio de sesión con Facebook, debes desactivar este flujo. Sin embargo, ten en cuenta que no puedes solicitar permisos para un token de acceso si tienes el inicio de sesión de OAuth de cliente desactivado. Encontrarás esta configuración en la sección Productos > Inicio de sesión con Facebook > Configuración del panel de apps.

  • Desactiva el flujo de OAuth web o especifica una lista de autorizados de redireccionamiento. La configuración de inicio de sesión de OAuth web activa cualquier flujo de token de cliente de OAuth que utilice el cuadro de diálogo de inicio de sesión web con Facebook para devolver tokens a tu sitio web. Esta configuración se encuentra en la sección Productos > Inicio de sesión con Facebook > Configuración del panel de apps. Desactiva esta configuración si no estás creando un flujo de inicio de sesión web personalizado o usando el SDK de inicio de sesión con Facebook en la web.

  • Aplica HTTPS. Esta configuración requiere HTTPS para los redireccionamientos de OAuth, y requiere que todas las llamadas al SDK de Facebook para Javascript que devuelvan o requieran un token de acceso se realicen únicamente desde páginas HTTPS. Todas las apps nuevas creadas a partir de marzo de 2018 tienen esta configuración activada de forma predeterminada, y deberás migrar cualquier app actual para que use solo URL HTTPS antes del 6 de octubre de 2018. La mayoría de los principales hosts de apps en la nube proporcionan una configuración automática y gratuita de certificados TLS para tus apps. Si te encargas del alojamiento de tu app o si tu servicio de hosting no ofrece HTTPS de forma predeterminada, puedes obtener un certificado gratuito de tus dominios en Let's Encrypt.

  • Desactiva el flujo de OAuth del navegador integrado si tu app no lo usa. Con el objetivo de autenticar los usuarios, algunas apps nativas para celulares y computadoras realizan el flujo de cliente de OAuth dentro de una vista web integrada. Si tu app no lo hace, desactiva la configuración en la sección Productos > Inicio de sesión con Facebook > Configuración del panel de apps.

  • Desactiva los flujos de inicio de sesión único en dispositivos móviles si tu app no los usa. Si tu app no usa el inicio de sesión con iOS o Android, desactiva la configuración de "Inicio de sesión único" en las secciones iOS y Android de Configuración > Básica.

El panel de apps contiene varios ajustes de configuración adicionales que permiten a los desarrolladores cerrar áreas de ataque que, de lo contrario, podrían causar problemas de seguridad.

  • Básica > Clave secreta de la app: si la clave secreta de la app es vulnerada, puedes restablecerla desde aquí.
  • Básica > Dominios de la app: usa esta opción para bloquear los dominios y los subdominios que se pueden usar para realizar el inicio de sesión con Facebook en nombre de tu app.
  • Opciones avanzadas > Tipo de app: si creas una app nativa para celulares o computadoras e incluyes la clave secreta de la app, configura esta opción en Native/Desktop para proteger tu app de modo que no sea posible descompilarla y que no puedan robar la clave secreta de tu app.
  • Opciones avanzadas > Lista de IP del servidor autorizadas: especifica una lista de las direcciones IP desde las que se pueden hacer llamadas a la API Graph con la clave secreta de tu app. Las llamadas a la API Graph realizadas con tu clave secreta de la API Graph desde fuera de este rango fallarán. Esta configuración no afecta las llamadas realizadas con tokens de acceso de usuario.
  • Opciones avanzadas > Actualizar lista de IP autorizadas de la configuración: bloquea las direcciones IP desde las que las personas pueden modificar esta configuración de la app a un rango específico. Si configuras una lista de IP autorizadas en una conexión de banda ancha residencial, ten mucho cuidado. Si tu dirección IP cambia, perderás la capacidad de editar la configuración de tu app.
  • Opciones avanzadas > Correo electrónico para notificación de actualizaciones: envía una notificación a una dirección de correo electrónico cada vez que se cambia una configuración de la app en el panel de apps.
  • Opciones avanzadas > Seguridad de URL en conjuntos de publicaciones: evitará que tu app publique direcciones URL que no apunten de vuelta a un dominio propio. Esto no siempre será útil, en especial, si sabes que tu app publicará enlaces a otros sitios.