10-12-2008, 04:17 PM
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)
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)
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
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 :
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 :
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
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
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 :
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 :
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 :
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 :
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 :
function JeTriche()
{
Resultat (
{
Vainqueur : PJ (mon id),
Vaincu : le Mob que je veux tuer (son id)
}
);
}
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
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
![[Image: Image%201_u1223919785.png]](http://upload.jeuweb.net/uploaded/Image%201_u1223919785.png)