13-12-2010, 08:58 AM
(12-12-2010, 09:36 PM)blingcru2 a écrit :(12-12-2010, 02:14 AM)Jeckel a écrit : Ca c'est le meilleure moyen pour se faire pirater sa base de données :
$db->execute("select * from `players` where `username`=?", array($_GET['username']));
Heum Si tu serais lire le code tu aurais compris que Nous allons chercher le Username du Joueur que nous attackons et pas l'inverse ^^
Juste pour répondre sur ce point, mais il ne serait peut-être pas inutile de faire un sujet à part entière sur le sujet :
Imagine que l'utilise, dans l'URL, arrive à faire passer une valeur du type JECKEL\" OR \"1...
La requête exécutée va alors ressembler à ceci :
select * from players where username = "JECKEL" OR "1"
Ce qui va modifier complètement le résultat du code... certainement faire planter ton script, et il faut savoir que les messages d'erreur sont très souvent la première source d'information pour hacker un site.
Donc ensuite en tâtonnant il peut aller plus loin, en modifiant la requête comme ça :
select * from players where username = "JECKEL" UNION select * from users
Là notre utilisateur au lieu de charger tous les "joueurs" il charge tous les utilisateurs, sans doute avec leur mot de passe... et le coup de grâce :
select * from players where username = "JECKEL" UNION select mot_passe as username from users
Voilà la base d'une injection SQL, sachant que ça je te l'ai fait en aveugle, mais si tu as ce genre de code un peu partout, l'utilisateur peut rapidement avoir accès à toute ta base de données...
select * from players where username = "JECKEL" UNION show tables
lui donnera par exemple la liste des tables de ta base de données...La solution ? tout d'abord ne jamais au grand jamais utiliser la valeur reçue de l'utilisateur directement, que ce soit pour une requête, ou pour un include, une ouverture de fichier ou autre...
Un premier traitement doit vérifier que la valeur reçue est présente (déjà) et ensuite qu'elle est "propre".
Dans ton cas, par exemple vérifier simplement qu'elle ne contient que des caractères alpha numérique serait suffisant. (a-zA-Z0-9 )