Sécurisation des données HTTP d'un jeu JavaScript sur un serveur

8

Supposons que je fais un jeu JavaScript et que je souhaite que le jeu mette à jour le serveur si l'utilisateur a terminé avec succès le jeu et son résultat.

Comment dois-je m'assurer que la demande provient du jeu JavaScript et que les données envoyées n'ont pas été falsifiées. J'utilise PHP comme langage côté serveur.

Je comprends qu'aucune stratégie ne sera à 100% infaillible, et toutes les mesures prises sont plus dissuasives qu'une protection absolue.

Lors de l'édition: supposons que nous n'utilisons pas la vérification par le serveur de l'étape de chaque utilisateur (comme dans un MMO traditionnel). Le jeu peut être un mini-jeu dans le cadre d'un jeu Web ou d'un jeu éducatif (envahisseurs spatiaux ou jeu en temps réel, par exemple) et nécessiter un composant côté serveur pour chacun de ces jeux peut être fastidieux.

Exemple: Supposé, lorsque le jeu est terminé, une demande est envoyée au serveur via. AJAX

game_finished.php?user_id=1&outcome=success&score=88

Un utilisateur peut «truquer» le serveur en croyant que le jeu s'est terminé correctement en envoyant cette demande à game_finished.php. Comment cela pourrait-il être rendu plus difficile?

Extrakun
la source

Réponses:

10

un puzzle de bloc coulissant, par exemple

C'est un exemple où la vérification côté serveur est triviale. Il n'est pas nécessaire de vérifier chaque étape jusqu'à la fin du jeu. Envoyez simplement la liste complète des déplacements et le serveur la relit pour vous assurer qu'elle est correcte.

(Modifier: le but de cette réponse n'est pas de choisir des exemples jusqu'à ce que vous en trouviez un qui n'est pas trivialement validable. Au contraire, cela devrait vous faire revenir en arrière et regarder le jeu que vous créez réellement - il est probablement trivialement validable, ou n'a besoin que d'une petite modification.)


la source
Je réfléchissais à l'exemple et ce n'est pas le meilleur des exemples. Disons alors Space Invaders. Je mettrai à jour la question.
Extrakun
2
Le mouvement des Space Invaders est également totalement déterministe. Il vous suffit d'enregistrer le moment où chaque paire de coups / coups se produit, de simuler le mouvement jusqu'à ce moment (qui est une simple équation linéaire) et de vous assurer qu'il s'agissait bien d'un coup.
J'ai finalement compris ce que tu veux dire après y avoir réfléchi. Merci
Extrakun
Juste un ajout à l'aspect "totalement déterministe": si vous avez besoin de hasard dans votre jeu, passez une graine spécifique pour ce hasard au client et enregistrez cette graine sur le serveur. Lorsque le client envoie le journal de jeu pour confirmation, le serveur peut également rejouer les parties qui impliquent un caractère aléatoire. La même chose est possible pour les étapes qui dépendent de l'heure locale. Voir les algorithmes de sauvegarde et de chargement d' Undum ( undum.com ) comme exemple de la façon dont cela peut être fait en JavaScript.
BerndBrot
2

Vous pouvez le faire à la manière de Warcraft: utilisez Javascript uniquement pour envoyer des commandes de mouvement au serveur et laissez le serveur gérer la logique.

Cela vous laisse toujours ouvert aux robots (programmes javascript qui permettent de déplacer les choses plus rapidement et plus précisément que ce qui est humainement possible), mais c'est une grande étape par rapport à laisser la porte ouverte à l'astuce /game_finished.php.

egarcia
la source
1

Si vous demandez au client de calculer le score, il n'y a aucun moyen de le valider au-delà (comme indiqué) du fait que le serveur rejoue le jeu pour confirmer qu'il obtient le même score.

Il existe cependant des types de jeux que vous pouvez concevoir qui ne fonctionnent pas sur la base d'un simple score numérique. Un script côté serveur peut générer un problème mathématique d'addition aléatoire par exemple, et lorsque l'utilisateur soumet la réponse, il peut comparer sa réponse avec la bonne et le noter côté serveur.

Mais si votre jeu est complexe (comme l'exemple des envahisseurs spatiaux), vous ne pouvez pas faire grand-chose à part a) faire confiance au client ou b) laisser le serveur gérer le jeu.

Tim Holt
la source
-1

Il existe de nombreuses méthodes, mais toutes échoueront finalement. Vous pouvez ajouter une valeur de hachage ou une clé de requête renouvelée à chaque requête.

Mais la chose la plus importante est que toutes vos fonctions de super encodage sont envoyées en tant que codes source au navigateur des clients et c'est LE problème. Pour le rendre un peu plus difficile, vous pouvez utiliser la fonction d'envoi par requête Ajax, afin que les sources ne soient pas disponibles sous une URL. La fonction doit être envoyée compressée, et peut-être même par parties, il sera donc plus difficile de tout copier. Je voudrais également vérifier ce code dans une page comme http://jsbeautifier.org/ si, après l'avoir rendu lisible, votre code est facile à comprendre.

Penseur
la source