2010-08-04 20 views
7

Estoy construyendo una aplicación de redes sociales en Flash (AS3) estrechamente integrada con Facebook: todas las cuentas de usuario se manejan a través de Facebook y se maneja toda la conectividad de Facebook a través de una combinación de las API Javascript y AS3 Facebook. Estoy usando Codeigniter en el backend para la gestión de datos del lado del servidor, que incluye el seguimiento de las acciones y los datos del usuario en el sitio a través de URLRequests desde Flash.Aplicación de la autenticación de Facebook: del lado del cliente y del servidor

Mi problema es que no sé cómo evitar la falsificación de las solicitudes del servidor que se realizan desde Flash; en teoría, los usuarios maliciosos podrían rastrear las llamadas que Flash está haciendo a mi servidor y reproducirlas de una manera que (por ejemplo) inserte datos basura y los asocie con una ID de usuario de Facebook determinada en mi base de datos. Toda la autenticación se lleva a cabo en el lado del cliente (a través de la API JS de Facebook) sin intervención del servidor, por lo que estoy teniendo dificultades para averiguar exactamente cómo asegurar las llamadas entre Flash y el servidor de una manera que asegure que los usuarios tienen que ser autenticados con Facebook para poder hacerlos.

Una posibilidad que consideré es usar un esquema de encriptación conocido por el cliente y el servidor para pasar los UID de Facebook de ida y vuelta, lo que sin duda sería mejor que pasarlos a la vista. Sin embargo, solo tomaría un hacker emprendedor con suficiente tiempo/paciencia para romper el esquema (o descompilar el swf) para arruinar todo.

De todos modos, puede que esté pensando demasiado, pero parece ser un punto importante y realmente no estoy seguro del mejor enfoque. ¡Cualquier comentario sería muy apreciado!

Respuesta

1

Esto es una preocupación legítima porque está en violación de CWE-603: Use of Client-Side Authentication. La encriptación no puede ayudar a esta estación porque un cliente malicioso podrá obtener cualquier secreto.

El mejor método para verificar un cliente es hacer que la aplicación flash envíe information about the session de vuelta al servidor. Luego, el servidor debe conectarse de nuevo a Facebook usando algo como el php api, de modo que el servidor pueda verificar que el cliente tenga una sesión válida con Facebook. Esto se debe hacer una vez por inicio de sesión, y luego puede emitir una identificación de sesión (cookie) a la aplicación flash para acceder a su almacén de datos para ese usuario.

+0

Rook, ¿se refiere al token de acceso como la información sobre la sesión que está disponible para el cliente y puede ser utilizada por el servidor para conectarse a FB? – Totach

+0

Solo para hacerte saber, tu enlace wiki.developers.facebook está roto. Referencia: meta.stackoverflow.com/q/101241/149820 – staticbeast

+0

Esto es incorrecto. Si bien es una forma de lograr esto, más eficiente es usar la cookie establecida por las libs del cliente (javascript). – MetaChrome

6

¡Acabo de pasar un montón de tiempo tratando de resolver esto! Sé que esta es una pregunta antigua, pero espero que sea útil para usted o al menos para alguien más.

El problema básico es como dijiste. Si está realizando una autenticación del lado del cliente, pero desea realizar algunas operaciones del lado del servidor específicas del usuario, también necesita autenticar la seguridad del usuario en su sistema. Lo ideal sería evitar que vuelva a iniciar sesión con una contraseña, ya que sería una experiencia de usuario horrible. Entonces, uno podría sentirse tentado de enviar el UID y registrarlo de esa manera. Lamentablemente, existe un riesgo obvio de seguridad para esto. Como usted señala, cualquiera puede pasar el UID que generalmente es de conocimiento público e iniciar sesión como alguien que no es.

La solución a este problema es utilizar la información almacenada en una cookie que cae la API de Facebook después de que un usuario inicie sesión correctamente. La información contenida en la cookie contiene la información del usuario, así como datos de firma únicos. Si el servidor toma el contenido de la cookie y lo procesa correctamente, debería aparecer un código secreto. Este código secreto debe coincidir, exactamente, con el código secreto de la aplicación que solo tú y Facebook conocen. Si lo hace, entonces sabrá que la cookie (y, por lo tanto, el usuario) es legítima. Si no es lo mismo, entonces sabes que alguien está intentando algo gracioso.

Para obtener más información, es posible considerar visitar estas páginas: PHP - https://developers.facebook.com/docs/guides/web/#personalization Ruby - http://vombat.tumblr.com/post/835536630/ruby-version-of-facebooks-get-facebook-cookie-in-php

También debo señalar que existen enfoques similares para ambos LinkedIn y Twitter.

Cuestiones relacionadas