2010-08-04 8 views
7

Je construis une application de médias sociaux en Flash (AS3) qui est étroitement intégrée à Facebook - tous les comptes utilisateurs sont gérés via Facebook connect, et toute la connectivité Facebook est gérée via une combinaison des API Javascript et AS3 Facebook. J'utilise Codeigniter sur le backend pour la gestion des données côté serveur, qui comprend le suivi des actions de l'utilisateur et des données sur le site via URLRequests de Flash.Application de l'authentification Facebook: côté client et côté serveur

Mon problème est que je ne sais pas comment empêcher l'usurpation des requêtes du serveur qui sont faites à partir de Flash; en théorie, les utilisateurs mal intentionnés peuvent suivre les appels que Flash effectue sur mon serveur et les reproduire de telle sorte que (par exemple) insère des données parasites et les associe à un identifiant utilisateur Facebook donné dans ma base de données. Toute l'authentification se fait du côté client (via l'API JS de Facebook) sans aucune intervention du serveur, donc j'ai du mal à trouver exactement comment sécuriser les appels entre Flash et le serveur d'une manière qui assure que les utilisateurs doivent être authentifiés avec Facebook pour les faire. Une possibilité que j'ai envisagée est l'utilisation d'un schéma de chiffrement connu par le client et le serveur pour transmettre les UID de Facebook, ce qui serait certainement mieux que de les passer en clair. Cependant, cela ne prendrait qu'un hacker entreprenant avec suffisamment de temps/patience pour casser le système (ou décompiler le swf) pour tout vider.

De toute façon, je pense peut-être à cela, mais cela semble être un point important et je ne suis pas sûr de la meilleure approche. Tous commentaires serait grandement apprécié!

Répondre

1

Ceci est une préoccupation légitime, car vous êtes en violation de CWE-603: Use of Client-Side Authentication. Le cryptage ne peut pas aider cette station car un client malveillant pourra obtenir n'importe quel secret.

La meilleure approche pour vérifier un client consiste à renvoyer l'application flash information about the session au serveur. Le serveur doit alors se connecter à Facebook en utilisant quelque chose comme le php api de sorte que le serveur puisse vérifier que le client a une session valide avec facebook. Cela doit être fait une fois par connexion, et vous pouvez ensuite attribuer un identifiant de session (cookie) à l'application flash pour accéder à votre magasin de données pour cet utilisateur.

+0

Rook, faites-vous référence au jeton d'accès en tant qu'information sur la session disponible pour le client et que le serveur peut utiliser pour se connecter au FB? – Totach

+0

Juste pour vous le faire savoir, votre lien wiki.developers.facebook est cassé. Référence: meta.stackoverflow.com/q/101241/149820 – staticbeast

+0

Ceci est incorrect. Bien que ce soit un moyen d'accomplir cela, le plus efficace est d'utiliser le cookie défini par les bibliothèques client (javascript). – MetaChrome

6

Je viens de passer une tonne de temps à essayer de comprendre celui-ci! Je sais que c'est une vieille question, mais j'espère que cela vous sera toujours utile ou au moins quelqu'un d'autre.

Le problème de base est exactement comme vous l'avez dit. Si vous effectuez une authentification côté client, mais que vous souhaitez effectuer certaines opérations côté serveur spécifiques à l'utilisateur, vous devez également authentifier l'utilisateur sur votre système. Idéalement, vous voudriez éviter qu'ils se reconnectent avec un mot de passe et ainsi de suite parce que ce serait une expérience utilisateur horrible. On pourrait donc être tenté de simplement envoyer l'UID et de le connecter de cette façon. Malheureusement, il y a un risque évident pour la sécurité. Comme vous le faites remarquer, n'importe qui peut passer l'UID qui est généralement connu du public et se connecter comme quelqu'un qu'il n'est pas.

La solution à ce problème consiste à utiliser les informations stockées dans un cookie que l'API facebook supprime après la connexion réussie d'un utilisateur. Les informations contenues dans le cookie contiennent les informations utilisateur ainsi que des données de signature uniques. Si le serveur saisit le contenu du cookie, et que vous le traitez correctement, vous devriez sortir un code secret. Ce code secret devrait correspondre, exactement, à votre code secret d'application que seuls vous et facebook connaissez. Si c'est le cas, alors vous savez que le cookie (et donc l'utilisateur) est légitime. Si ce n'est pas la même chose, alors vous savez que quelqu'un essaie quelque chose de drôle.

Pour plus d'informations, vous pouvez envisager de vérifier ces pages: 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

Je tiens également à noter que les approches similaires pour les deux LinkedIn et Twitter existent.

Questions connexes