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?
la source
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.
la source
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.
la source
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.
la source