Un essai pour éviter la triche pour les jeux en javascript - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : Un essai pour éviter la triche pour les jeux en javascript (/showthread.php?tid=3164) |
Un essai pour éviter la triche pour les jeux en javascript - Ter Rowan - 12-10-2008 Je suis loin d'avoir les compétences requises pour m'assurer et assurer les lecteurs du post qu'il n'y a pas d'erreurs dans ce que je vais avancer. J'attends donc de nos experts qu'ils critiquent / amendent / corrigent mon post, en espérant qu'à terme, un véritable tutoriel sur la sécurité voit le jour (oui je suis intéressé ) Je vais m'essayer à proposer une "architecture" (le mot est pompeux) suite à une conversation que j'ai eu cette semaine pour éviter certaines failles. J'utiliserais les termes Javascript pour n'importe quel langage "exécuté sur le poste du joueur" et PHP pour n'importe quel langage "exécuté sur le serveur" Considérons le sujet d'un simple combat (je gagne ou je perd) entre un personnage joueur (PJ) et un monstre (Mob). La situation initiale : Le PJ décide de combattre le Mob. On peut identifier les différentes étapes de résolution (cette liste est indicative peu importe dans le débat si c'est ce qui doit être fait ou s'il en manque) 1) vérification de la capacité du PJ d'attaquer le Mob As t'il assez de points d'action, est il à bonne distance, etc... ? si oui alors on lance l'ordre du combat. Je vais formaliser cet ordre sous un format un peu particulier (une fonction, des variables que je nomme) Code PHP :
2) démarrage du combat, On fait les calculs et on détermine qui est le vainqueur. C'est la fonction Combattre appelée dans le 1) Code PHP :
3) mise à jour de la base de données On sait qui est vainqueur, qui est vaincu, et on modifie la bdd en conséquence (c'est la fonction résultat appelée dans le 2 Code PHP :
enfin une dernière étape mais je n'en parlerai pas car peu d'intérêt pour le sujet triche : 4) affichage des résultats (mise à jour de la page du client en fonction du vainqueur et du vaincu La question est : Quand utiliser Javascript et quand utiliser PHP ? Pour y répondre, je vais aller de ce qui me semble le plus simple au plus compliqué 3) mise à jour de la base de données Extrêmement simple, je ne sais pas mettre à jour la bdd en javascript, donc je le fais forcément en php (enfin moi Ter Rowan je ne sais pas le faire autrement, voilà ça c'est dit) 2) la résolution du combat ( Qui a gagné ?) Là on rentre dans le coeur du débat En effet, ce ne sont que des calculs : on peut le faire aussi bien en javascript qu'en php. Alors quoi faire ? une seule solution pour éviter la triche : en php Pourquoi ? prenons le cas du calcul en javascript : dans le code de la page (visible par n'importe qui, il suffit d'installer un addon à son navigateur, exemple firebug pour n'en citer qu'un) on voit distinctement : Code PHP :
Conclusion je suis un vilain tricheur... je suis sur le jeu, j'identifie les id de tout ce qui est sur la page (voire sur le jeu) j'obtiens les id de tous les personnages (dont le mien) et les mobs là je ne lance pas l'ordre dans le jeu, mais je me crée une mini page html avec un tout petit bout de code javascript en plus des codes javascript du jeu : Code PHP :
ne pas utiliser Javascript pour calculer le résultat d'un combat, utiliser PHP 1) vérification de la capacité du PJ d'attaquer le Mob Là c'est à peine plus compliqué... En effet, la conclusion du combat qu'on vient de voir devrait être : les tests sont des calculs le joueur pourrait être un tricheur et faire de même avec javascript donc je fais du php et là je dis "Oui mais" : Oui car si on ne fait pas les tests en php, on se retrouve dans le même cas que tout à l'heure, certes le résultat n'est pas qui gagne, mais qui peut se battre le tricheur devient capable de se téléporter à n'importe quel endroit de la carte pour se battre, a un nombre de points d'action infini, etc... Mais on devrait aussi faire le test en javascript. En effet si javascript arrive à dire au joueur qui ne triche pas "C'est impossible, le PJ n'a pas assez de point d'actio" ou "C'est impossible, le mob est trop loin" alors on évite au serveur de faire le test puisque javascript arrêtera le processus avant utiliser Javascript pour tester sur le post du joueur avant de faire un appel serveur, pour soulager le serveur ne pas faire confiance à Javascript pour tester, utiliser php pour tester une seconde fois voilà j'espère être clair et ne pas avoir dit trop de bêtise N'hésitez pas (les bons) à lancer un vrai tutoriel sur la sécurité, ça manque RE: Un essai pour éviter la triche pour les jeux en javascript - Nosrehl - 12-10-2008 C'est utopique de vérifier en javascript la page référente ? Un gars se fait sa page perso avec son code javascript traficoté. Pour les requêtes sql, il devra appeler une page en php qui se trouve sur le serveur (obligatoire, non ?), sur laquelle on peut vérifier la page référente (document.referrer) et agir (:bannis. Je me demande ce que ça vaut côté sécurité parce qu'il paraît qu'il est (très rare mais) possible de changer cette variable en modifiant des paramètres du navigateur. RE: Un essai pour éviter la triche pour les jeux en javascript - Ter Rowan - 13-10-2008 salut tu vas au delà de mes compétences là dessus, je ne sais pas te répondre RE: Un essai pour éviter la triche pour les jeux en javascript - Sephi-Chan - 13-10-2008 La page référante n'est effectivement pas une solution viable puisqu'elle est falsifiable (et/ou désactivable), comme en témoigne cette capture d'écran de Firefox et son extension Web Developer. À mon sens, Javascript n'introduit pas de failles dans l'application puisqu'il ne fait qu'appeler des pages comme le feraient n'importe quel lien/formulaire. Dans tous les cas, les gens peuvent falsifier les informations qu'ils envoient, et dans tous les cas je vérifie les choses. Certains jeux (que je testais il y a longtemps) permettaient de facilement tricher. Une page où l'on pouvait acheter des objet contenait le prix dans un champ caché… C'est une mesure inutile ! Dans ce genre de cas, seul l'id de l'objet doit être utilisé. Ainsi, si l'utilisateur le falsifie, il se retrouvera simplement avec un autre objet : le programme aura effectué ces calculs en se basant sur le prix de l'objet dont l'id est envoyé par l'utilisateur. Ce qui peut être marrant, c'est de mettre un champ caché contenant le prix… pour piéger les tricheurs (qui mettent une somme négative, par exemple). Sephi-Chan RE: Un essai pour éviter la triche pour les jeux en javascript - Plume - 13-10-2008 Et il se la pète avec ses belles captures d'écran niquel chrome avec ombre portée ! @tchaOo° RE: Un essai pour éviter la triche pour les jeux en javascript - Sephi-Chan - 13-10-2008 J'y peu rien. Désolé d'avoir un OS qui a la classe. RE: Un essai pour éviter la triche pour les jeux en javascript - P0ulp0r - 13-10-2008 Personnellement j'applique la même que Sephi Chan. Dans le pire des cas comme le dit Sephi, le joueur n'aura pas le bon item Je pense que cela doit être la meilleure solution. N'empêche j'y avais pas pensé de faire semblant de mettre un champ caché pour le prix. Bonne méthode pour connaître des potentiels tricheurs RE: Un essai pour éviter la triche pour les jeux en javascript - Ludvig - 13-10-2008 Depuis Diablo tout le monde fais la sécurité sur le serveur ^^ (ah oui les bases de la sécurité sont les mêmes sur un mmorpg que sur un jeu web) TOUT ce qui a le moindre importance doit être calculé par le serveur et TOUT ce que le joueur envois doit être vérifié par le serveur. Facile & pratique hein iffle: ps. +1 pour P0ulp0r, c'est toujours intéressant de savoir qui essaye de tricher (il faut toujours logguer les "erreurs" et leurs créateurs) RE: Un essai pour éviter la triche pour les jeux en javascript - Nosrehl - 14-10-2008 Des variables de sessions ne peuvent pas être une solution pour vérifier que la page référente appartient bien au site ? RE: Un essai pour éviter la triche pour les jeux en javascript - Chansey - 14-10-2008 Mais on peut bien afficher le resultat en JS non? Php => Calcul JS => Affichage Non? Enfin j'ai fais comme ça moi. |