08-06-2009, 06:20 PM
(Modification du message : 08-06-2009, 06:32 PM par Sephi-Chan.)
Dans ce cas, c'est que la page de suppression de compte réservée aux administrateurs est accessible à tous.
Tu as deux choses à faire :
J'explique rapidement la technique du jeton (ou token, en anglais). Je ne garantis pas que le code est syntaxiquement correct, ça fait un moment que j'ai pas dev en PHP.
Sur la page contenant la liste des utilisateurs que l'on peut supprimer, tu génères un hash unique : le but est de forcer à passer par cette page pour supprimer un utilisateur. Ça garantit que c'est bien un administrateur (à moins que tu n'ai une autre faille à ce niveau ) qui supprime l'utilisateur.
Cela te donnera une URL de la forme :
Puis dans la page qui efface effectivement le compte, tu testes la présence du token et l'égalité avec le token écrit dans la session. Bien sûr, tu testes également si l'utilisateur courant est administrateur.
Cette sécurité fait d'une pierre deux coups puisque grâce à ça, ton site n'est plus vulnérable si quelqu'un s'amuse à te faire cliquer sur un lien de la forme http://monsite.ext/delete_user.php?id=27 puisque malgré ton statut d'administrateur, ton système te dira que tu n'es pas passé par la page qui liste les utilisateurs.
Je te conseille de lire cet article : PHP Security - Guide de Sécurité PHP : Traitement des formulaires.
En dehors de ça, peut-être pourrais-tu nous coller la source de cette page sur Pastebin.
Sephi-Chan
Tu as deux choses à faire :
- Mettre une condition sur le statut de l'utilisateur courant. Il faut qu'il soit administrateur pour accéder à la page.
- Utiliser un jeton de sécurité dans ta page de suppression d'un utilisateur.
J'explique rapidement la technique du jeton (ou token, en anglais). Je ne garantis pas que le code est syntaxiquement correct, ça fait un moment que j'ai pas dev en PHP.
Sur la page contenant la liste des utilisateurs que l'on peut supprimer, tu génères un hash unique : le but est de forcer à passer par cette page pour supprimer un utilisateur. Ça garantit que c'est bien un administrateur (à moins que tu n'ai une autre faille à ce niveau ) qui supprime l'utilisateur.
<?php
$token = md5(uniqid(mt_rand(), true))
$_SESSION['token'] = $token
?>
<ul>
<?php foreach($users as $user): ?>
<li><a href="<?php echo "delete_user.php?id={$user->id}&token={$token}"; ?>">
Supprimer <?php echo $user->name; ?>
</a></li>
<?php endforeach; ?>
</ul>
Cela te donnera une URL de la forme :
Code :
http://monsite.ext/delete_user.php?id=27&token=9e107d9d372bb6826bd81d3542a419d6
Puis dans la page qui efface effectivement le compte, tu testes la présence du token et l'égalité avec le token écrit dans la session. Bien sûr, tu testes également si l'utilisateur courant est administrateur.
<?php
if(isset($_GET['token'])){
if($_GET['token'] == $_SESSION['token']){
/**
* Le token transmis est identique à celui écrit en session.
* On peut effacer l'utilisateur.
*/
}
else {
/**
* Le token transmis est différent de celui écrit en session. Il y a
* tentative de hack : le pirate n'est pas passé par la page qui liste
* les utilisateurs.
*/
}
}
else {
/**
* Le token n'est pas transmis. Il y a une tentative de hack
* puisque la personne n'est pas passée par la page qui liste
* les utilisateurs.
*/
}
Cette sécurité fait d'une pierre deux coups puisque grâce à ça, ton site n'est plus vulnérable si quelqu'un s'amuse à te faire cliquer sur un lien de la forme http://monsite.ext/delete_user.php?id=27 puisque malgré ton statut d'administrateur, ton système te dira que tu n'es pas passé par la page qui liste les utilisateurs.
Je te conseille de lire cet article : PHP Security - Guide de Sécurité PHP : Traitement des formulaires.
En dehors de ça, peut-être pourrais-tu nous coller la source de cette page sur Pastebin.
Sephi-Chan