JeuWeb - Crée ton jeu par navigateur
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)

Pages : 1 2 3


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é Wink )

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 :
<?php 
function Test()

if (
PJ peut se battre avec MOB )
{
Combattre (
{
Combattant 1 : PJ,
Combattant 2 : MOB
}
);
}
}

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 :
<?php 
function Combattre ( Combattant 1 , Combattant 2 )
{
/*récupère les données */
.....

/* fait les calculs */
.....

/* lance l'ordre de mise à jour de la bdd via une fonction même format que 1 */

Resultat (
{
Vainqueur : X,
Vaincu : Y
}
);

}

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 :
<?php 
function Resultat ( Vainqueur, Vaincu )
{
/* mise à jour des informations pour le vainqueur */

update XXX set xxx_Victoire = xxx_Victoire +1 where xxx_id = Vainqueur;

/* mise à jour des informations pour le vaincu */

update XXX set xxx_Defaite = xxx_Defaite +1 where xxx_id = Vaincu;
}




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 :
<?php 
function Combattre ( Combattant 1 , Combattant 2 )
{
/*récupère les données */
.....

/* fait les calculs */
.....

/* lance l'ordre de mise à jour de la bdd via une fonction même format que 1 */

Resultat (
{
Vainqueur : X,
Vaincu : Y
}
);

}

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 :
<?php 
function JeTriche()
{
Resultat (
{
Vainqueur : PJ (mon id),
Vaincu : le Mob que je veux tuer (son id)
}
);
}
et je lance cette fonction. Que se passe t il ? JeTriche se lance et donne l'ordre à résultat que PJ a battu le Mob, Resultat fait quoi ? il fait se qu'il sait faire et met à jour la base de données et hop, je réactualise le jeu : PJ a battu le Mob pour tout le monde, j'ai réussi à tricher

Arrow 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

Arrow utiliser Javascript pour tester sur le post du joueur avant de faire un appel serveur, pour soulager le serveur
Arrow 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 Wink


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 (:bannisSmile.

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 Smile 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.

[Image: Image%201_u1223919785.png]

À 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). Smile


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. Big Grin


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 Wink

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 Smile


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 Confusediffle:


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.