Boo2M0rs0
mercredi 1 juin 2005 à 07:50
Il y a un truc meurtrier assez connu comme faille qui arrivent: l'injection sql
Par exemple on a une table 'utilisateur' qui contient 3 champs : 'id' , 'email' 'is_admin'
Si on veut changer l'email de quelqu'un grâce à un forumulaire, il faudrait faire une requête de ce genre apres avoir recu le formulaire:
CODE
$sql = mysql_query("UPDATE utilisateur SET `email` = '{$_GET['nouveau_mail']} WHERE id = $id");
Donc si l'utilisateur veut mettre foo_AT_bar.com (j'ai vu qu'on prenais souvent ce genre de mot pour les exemples) en nouvelle adresse, la requête va devenir:
SQL
UPDATE utilisateur SET `email` = 'foo_AT_bar.com'
Seulement que se passe t-il si on veut en nouvel email la chaine:
' , `is_admin` = '1
On a la commande sql qui fonctionnne:
SQL
UPDATE utilisateur SET `email` = '' , `is_admin` = '1'
N'importe qui en s'enregistrant sur un site peut devenir l'admin juste en changeant d'adresse !
Pour éviter cela, on utilise souvent la fonction addslashes() qui ajoute un caractère d'échappement devant tout les caractères à risques.
Une option de php ( magic_quotes_gpc ) le fait aussi sur toute les données envoyés par l'utilisateur ( contenues dans $_GET , $_POST , $_COOKIE ).
Le risque d'éxecuter du php envoyé par l'utilsateur existe surtout pour l'upload de fichier, donc il faut toujours vérifier que le fichier envoyé ne contient pas l'extension .php à la fin (ou alors toute autre extension qui permet l'execution de php sur ton serveur) avant de l'enregistrer.
Si tu as des parties de sites où les utilisateurs peuvent réagir en postant des commentaires , bloquent aussi l'utilisation de l'html cette fois avec htmlentities().
Plus que le risque de faire crasher ton pc, ce sont plutot les visiteurs qui auront des problèmes, au mieux la page sera déformé avec un peu de javascript, au pire en se fesant voler leur identifiants.
Bon il existe bien d'autres trucs.
Bref, il faut toujours prendre le temps de "sécuriser" les données qui viennent de l'extérieur avant de s'en servir.