Salut,
Histoire de placer le contexte, je suis webmaster du jeu Fourmizzz.fr, j'ai une communauté de 11 988 joueurs dont 3 260 actifs et je dois dire qu'ils m'en font parfois voir des vertes et des pas mures au niveau sécurité.
J'aimerais vous faire partager mon expérience (douloureuse) de ce week-end à travers un petit défi.
Je vais donc vous présenter un petit bout de code qui permet d'annuler une attaque si celle-ci a était lancé il y a moins de deux minutes.
Dans ce petit code a priori inoffensif se cache une faille majeur, je vous met donc au défi de la trouver.
J'ai un peu sur-commenté chaque ligne histoire de vous simplifiez la compréhension du code.
Histoire de placer le contexte, je suis webmaster du jeu Fourmizzz.fr, j'ai une communauté de 11 988 joueurs dont 3 260 actifs et je dois dire qu'ils m'en font parfois voir des vertes et des pas mures au niveau sécurité.
J'aimerais vous faire partager mon expérience (douloureuse) de ce week-end à travers un petit défi.
Je vais donc vous présenter un petit bout de code qui permet d'annuler une attaque si celle-ci a était lancé il y a moins de deux minutes.
Dans ce petit code a priori inoffensif se cache une faille majeur, je vous met donc au défi de la trouver.
J'ai un peu sur-commenté chaque ligne histoire de vous simplifiez la compréhension du code.
Code PHP :
<?php
//Dans la variable $ID se trouve l'ID du joueur
/* ****** Annulation d'une attaque: ****** */
if(isset($_GET['annuler'])) //On vérifie s'il y a eu une demande d'annulation
{
$result = mysql_query("SELECT * from attaque WHERE IDAttaquant='$ID' AND ID='".$_GET['annuler']."'");//Si oui, on sélectionne l'attaque que l'ont doit annuler dans la base de données.
$donnee = mysql_fetch_array($result);
if($donnee['timestampDepart']>(time()-2*60))//Timestamp départ contient le timestamp au moment du lancement, on vérifie donc que cela fait moins de deux minutes que le lancement de l'attaque a eu lieu.
{
$Armee=getSoldats($donnee);//On extrait des donnees les informations décrivant l'armée. Pour vous simplifier la vie, on considére cette fonction sans faille.
addArmee($ID,$Armee,'2');//On remet l'armée en question au joueurs qui vient d'annuler l'attaque. Pour vous simplifier la vie, on considére cette fonction sans faille.
mysql_query("DELETE from attaque WHERE IDAttaquant='$ID' AND ID='".$_GET['annuler']."'");//On supprime l'attaque de la base de données.
}
}
/* ****** Affichage des attaques: ****** */
$resultat = mysql_query("SELECT * from attaque WHERE IDAttaquant='$ID'");
while ($donnees = mysql_fetch_array($resultat))
{
$tempsRestant = $donnees['timestamp'] - time();
echo '<p class="gras">- Vous allez attaquer '.getPseudo($donnees['IDDefenseur']).' dans '.convertiTemps($tempsrestant);//Message de l'attaque.
if($donnees['timestampDepart']>(time()-2*60)) //Si le joueur peut encore annuler l'attaque, alors on ajoute le lien pour pouvoir annuler.
{
echo ' - <a href="Armee.php?annuler='.$donnees['ID'].'">Annuler</a>';
}
echo ' </p>';
}
Si vous pensez avoir trouvé la solution, je vous invite a me l'envoyer par MP afin de ne pas la dévoiler aux autres (ca casserais leur plaisir de chercher).
Si vous avez besoin d'information complémentaire sur le script, n'hésitez pas. J'ai pas mal amputé le script pour le simplifier comme je pouvais.