2010-09-14 4 views
0

J'ai un jeu basé sur Flash pour le navigateur qui envoie les scores des utilisateurs à un script backend php qui stocke la partition et l'ID utilisateur dans la base de données.Éviter CSRF lors du traitement des requêtes AJAX ou Flash

Maintenant, j'ai une URL comme www.example.com/update.php?score=200 & uid = 234

Le problème est que ce qui est très bien exposée à un utilisateur intelligent, et il peut utiliser url pour stocker tout ce qu'il veut dans la DB. De plus, il n'y a pas d'authentification réelle des utilisateurs, et je n'en ai pas l'intention non plus, parce que c'est vraiment un jeu minuscule. Comment puis-je empêcher quelqu'un d'appeler l'URL ci-dessus et de mettre à jour son score par lui-même.

Répondre

2

Vous voudrez peut-être lire sur le hack "Marblecake" d'un online polling system. Remplacez le concept de "soumettre un vote" par "soumettre un score" et vous verrez que tout contrôle côté client est voué à l'échec. Bien qu'une bonne étape soit de crypter la partition ou d'utiliser un HMAC pour empêcher toute falsification, votre cryptage sera effectué dans le client Flash et l'application Flash peut être réorganisée pour la clé (cela augmente l'effort nécessaire pour triche, mais n'empêchera pas de tricher).

Afin de minimiser la tricherie, vous devez déplacer la logique de notation sur le serveur et vous devrez exécuter des vérifications de sécurité ou valider les actions des joueurs; Dans le cas contraire, l'approche de la triche serait l'exécution d'actions non valides qui conduisent à plus de points plutôt que de simplement rapporter le score final. À tout le moins, vous devriez être en mesure d'attacher des mises à jour de score à un utilisateur spécifique afin que les tricheurs puissent seulement affecter leur propre score et non pas autres'. Je ne peux penser à des moyens de limiter l'effet de la triche, comme la limitation du débit, de sorte que si un jeu moyen est de N minutes, le serveur n'accepte que 60/N mises à jour par heure. Ou utilisez une autre période/métrique. Mais pour ce que vous décrivez comme un petit jeu qui n'en vaut probablement pas la peine, d'autant plus qu'il ne fait que limiter le problème, il ne le résout pas.

0

Vous ne pouvez pas.

Ce n'est plus une question de CSRF. Parce que vous n'avez aucune authentification, n'importe qui sur terre peut mettre à jour le score de tout le monde. Il n'y a tout simplement aucun moyen d'empêcher cela.

Si vous êtes préoccupé par la sécurité, authentifiez l'utilisateur. Cela empêchera au moins un attaquant de mettre à jour les scores en masse.

Ensuite, résolvez votre problème CSRF. Avec chacune de ces URL, vous devez ajouter un jeton unique.

+0

Merci pour la réponse. J'ai pensé que ce n'était pas vraiment un problème CSRF. Je dois modifier ma question à ceci: Si j'ai besoin d'envoyer des données de mon application flash à mon serveur, quel est le meilleur moyen de le protéger afin que non seulement n'importe qui peut envoyer des données valides par leurs propres moyens? Je me figure que je peux crypter mes données que l'application flash envoie puis décrypter au backend et mettre à jour ma base de données seulement si elle est valide. C'est en supposant qu'un utilisateur intelligent ne peut toujours pas comprendre comment je crypte les données. – Paganwinter

+0

La seule façon d'y parvenir est d'authentifier vos utilisateurs avec un identifiant/mot de passe. Le cryptage des données n'est pas une solution, car si vous devez stocker la clé dans le fichier flash swf, un utilisateur intelligent peut facilement extraire cette clé du fichier. –

Questions connexes