Bonjour
magic_quotes_gpc est une option qu'il faut mettre sur off et ne pas compter dessus. Elle sera de toute maniere retiree de PHP 6.
Une injection mySQL est une attaque dont le principe est le suivant:
Lorsque vous entrez des donnees dans un formulaire (inscription, post, email, commande, recherche... etc), dans la majorite des cas, c'est un script PHP qui prend en charge le traitement du formulaire. Tres souvent, le PHP n'est qu'un point de passage. Le code PHP va creer une requete mySQL qui depend de ce que le client a entre dans le formulaire. Par exemple, si on cherche a ouvrir un session sur un forum, on rentre son nom d'utilisateur. Le script PHP va passer le nom d'utilisateur a mySQL pour lui demander de verifier que l'utilisateur est bien inscrit.
Imaginons la situation ou l'utilisateur est malicieux et au lieu de rentrer un user name tout bete, il va rentrer un bout de code dans le champ.
PHP va prendre le bout de code et va l'encapsuler dans la requete SQL et l'envoyer au serveur mySQL. Si l'attaque est bien faite, mySQL ne fera pas la difference entre la requete legitime et les donnees encapsulees dedans. Ce qu'il va voir c'est un grosse requete mySQL qu'il va executer.
Le resultat peut etre:
- Vandalisme: la requete demande a mySQL d'efface une table, des enregistrements... etc
- Defacage de site: la requete ajoute des donnees. Si vous avez un CMS, celui stocke les donnees de ses pages dans la base mySQL. Si ces donnees sont modifiees, elles peuvent etre diffusees aux visiteurs qui verra le contenu modifie.
- Piratage: la requete ajoute un compte qui n'existe pas. Le pirate pour l'utiliser pour ce connecter au site peut etre meme en Admin.
- Vol de donnees: la requete peut demander a mySQL d'afficher le contenu de certaines tables qui peuvent contenir des donnees confidentielles (cartes de credit par exemple).
- Attaque de visiteurs: combinee avec un exploit Firefox ou IE, le site peut commencer a injecter des virus ou malwares chez ses visiteurs... etc.
Voici un exemple concret:
Voici une requete mySQL comme celle qui peut etre envoyee lors d'un login sur un forum ou un site de eCommerce:
"SELECT * FROM users WHERE username = '".$_POST['username']."' AND password = '".$_POST['password']."'"
En Francais, cette instruction selectionne depuis la table qui s'appelle users, l'enregistrement, ou la ligne ou le username ET le mot de passe sont egaux aux valeurs rentrees dans le formulaire de login. Donc, le client entre un username et un mot de passe et le script va selectionner la ligne ou il trouve ces deux valeurs (bien ces DEUX valeurs, pas seulement l'une d'elles).
Par exemple, si le login est edelweisshosting et le mot de passe 123456, voici ce que sera la requete envoyee a mySQL:
"SELECT * FROM users WHERE username = 'edelweisshosting' AND password = '123456['password']'"
Bonjour, je suis pirate:
Je vais dans le formulaire et dans le champ username, je rentre admin. Ou bien tout autre username que je devine. Je sais que cet username existe (par exemple membre sur un forum, nom d'un client... etc). Et comme mot de passe, je rentre exactement ceci:
' OR ''=''
Puis, je clique pour valider et une requete est creee et envoyee au serveur. Elle sera comme ceci:
"SELECT * FROM users WHERE username = 'edelweisshosting' AND password = '' OR ''=''['password']'"
Vu comme c'est rentre, le serveur va prendre OR, = etc comme faisant partie integrante de l'instruction mySQL et donner un comportement autre au script PHP/SQL. Celui-ci va selectionner n'importe quel username entre, peu importe le mode passe.
La fonction magic_quotes a ete mise en place pour eviter que les utilisateurs ne puissent rentrer du code dans les formulaires PHP. Comme le comprote toujours certains caracteres comme les guillemets simples ou doubles, le magic_quote rajoute devant un backslash. Le resultat est que ceux-ci ne sont plus interpretes comme faisant partie d'un code, mais tout simplement comme du texte. Ca casserait un script injecte sur un formulaire. Ainsi:
' devient \'
" devient \"
\ devient \\
Ceci previent en bonne partie les injections mySQL mais ce n'est pas suffisant. Il faut le remplacer par un processus de validation qui prend en charge les elements entres dans un formulaire et les verifie avant de les passer a mySQL.
Autre exemple:
Le bout suivant est sense selectionner la ligne dans la base de donnees contenant une valeur que le client rentre. Par exemple, un nom d'utilisateur:
statement = "SELECT * FROM users WHERE name = '"username"';"
Par exemple, le pirate rentre ceci comme username dans le formulaire:
a' or 't'='t
Le code recu par mySQL est alors:
SELECT * FROM users WHERE name = 'a' OR 't'='t';
Dont la partie droite (en rougle) est tout le temps realisee (parce que t est toujours egal a t quelque soit la valeur de t).
Beaucoup de scripts gratuit en meme commerciaux (on ne va pas dire des noms) ne controlent pas du tout les donnees rentrees par un visiteur sur le site. C'est a dire que ces scripts sont immediatement vulnerables aux injections mySQL.