Accueil > Php > Securité PHP : Injections SQL – 2

Securité PHP : Injections SQL – 2

Bonjour amis codeurs,

Essayons maintenant de voir quelques attaques possibles sur des exemples concret. Évidemment, je ne citerai pas d’adresse précise, mon but n’est pas de vous inciter à pirater mais plutôt l’inverse.

Premier point d’attaque classique : les Identifiants.
Il est courant d’avoir besoin de donner un identifiant pour par exemple parler d’une catégorie, d’un article etc. De ce fait, vous avez une adresse de la forme

.php?id=[0-9]+

. Petit aparté : si vous ne comprenez pas le [0-9]+, renseignez vous sur les expressions régulières aussi appelées regex et plus particulièrement sur leur forme PCRE (Perl Compatible Regular Expressions). Il est important alors de vérifier ce que l’utilisateur passe en paramètre. Une protection simple et l’utilisation de la fonction

intval($_GET['id']);

. Cela forcera la valeur à un entier et vous la retournera. Cependant, si le visiteur met autre chose qu’un entier (par exemple le caractère ‘), intval retournera 0. De ce fait, afin de déterminer une erreur d’une valeur correcte, vous devez vous assurer que vos identifiants commencent à 1. Ainsi, si un pirate met autre chose qu’un entier, la valeur 0 ne correspondra à rien.

Deuxième point d’attaque : les formulaires.
Pour les valeurs entières, comme précédemment, utilisation de intval tout le monde a compris. Mais maintenant les chaines de caractères. Comme montré précédemment, la méthode sur un objet MySQLi est real_escape_string. Mais pourquoi protéger un INSERT ? Tout d’abord pour éviter un flood massif de votre base de données. En effet, il est possible de faire une requête INSERT mais sur plusieurs tuples. Mais de plus, il est possible de s’octroyer des droits parfois. Par exemple si vous êtes dans un formulaire de création de membres, il y a souvent une colonne « droits » dans la table liée. Ce champ est par défaut défini à « membre » mais il est possible via une injection SQL de mettre cette valeur à « administrateur ». Autre type de formulaire : mise à jour du mot de passe. Encore une fois, il est possible de changer une donnée qui ne nous est pas propre comme par exemple changer le mot de passe de l’administrateur.

Le plus simple reste encore les requêtes préparées. En gros, vous définissez une requêtes sans les valeurs, vous la compilez et ensuite vous entrez les valeurs en définissant leur type. Aucune injection possible.

Plus tard je vous donnerai un exemple de piratage simple pour vous montrer les risques.

Categories: Php Tags: , , ,
  1. alex
    06/12/2009 à 00:10 | #1

    certains serveurs web comme apache on une fonction a activé ou désactivé dans le cas de apache il sagit des magic_quote

  2. 06/12/2009 à 20:56 | #2

    Le terme exacte est magic_quotes_gpc et c’est une fonctionnalité de PHP. Par ailleurs, j’en ai parlé dans le premier volet de cet article, les magic_quotes sont désactivés par défaut dans PHP 5.3 et supprimés définitivement dans PHP 6. La raison est assez simple : ils incitent les développeurs à ne jamais se soucier de la sécurité de leurs applications. Ce faisant, ils ont des failles partout et du fait que tu ne contrôles pas les magic_quotes, tu ne peux pas t’assurer de leur fiabilité.

  1. Pas encore de trackbacks