wiki.travailleursduweb.com
Participez à l'encyclopédie des Travailleurs Du Web...

Combattre l’injection SQL

Publié le 17 January 2008, par Babozor dans la catégorie Développement, Gestion de projet

injection.jpg

Quoi? Mais keskecé que l’injection SQL?
Pour ceux qui ne le sauraient pas, l’injection SQL pour une application web est un équivalent à la grippe, un truc pas cool, qui fait bobo et qu’on pourrait simplement éviter (comme en se vaccinant par exemple, alors que le violent hacking brut-force pourrait trouver son analogie dans un bon vieux cancer du colon)…
L’injection SQL est le fait de rajouter un bout de code dans un champs d’un formulaire, de sorte qu’il soit interpréter par le moteur de base de données… c’est pas très dur à faire et aujourd’hui 90% (au moins) des sites sont complètement démuni contre ce type d’attaque.

Quels sont les risques?
Vous pouvez perdre une partie ou la totalité de vos données (suivant les cas, ce qui est déjà pas mal, avouez le…) ou voir vos données modifiées (comme un utilisateur standard passé en administrateur par exemple).

Comment se protéger
Il y a plusieurs moyens, l’idéal étant d’en cumuler certains pour assurer une sécurité maximale
- utilisez un utilisateur spécifique, qui a des droits restreints et ne pourra pas vider ou supprimer votre table de la base de données (mais cela ne l’empêche pas d’avoir dans certains cas les droits en suppression sur les données)
- utilisez des préfixes pour vos tables, pour éviter que votre table d’utilisateurs ne s’appelle user ou users, en ajoutant un prefix par exemple my_users, le nom de la table est beaucoup moins évident et donc un peu plus sûr. (pensez aussi quand vous installez des applications OpenSource type WordPress de ne pas laisser le préfixe standard toujours pour plus de sécurité)
- vérifiez et échappez toutes les données provenant des utilisateurs, en utilisant par exemple la fonction bien pratique mysql_real_escape_string en PHP… ne laissez aucune donnée brute, vérifiez au besoin, via une expression régulière…
- activez les protections internes (comme magic_quotes_gpc pour le PHP)
- utilisez des procédures stockées, là plus de soucis (ou presque) puisque les données sont passées en paramètres à votre moteur de base de données et non plus une requête dynamique.

C’est un type d’attaque trop souvent sous-estimé mais qui peut être dévastateur (et dramatique) pour votre système d’information.
C’est d’autant plus dangereux que c’est une attaque de bas niveau, tout le monde ou presque peut tenter sa chance, donc beware!
Si vous avez d’autres conseils ou anecdotes, n’hésitez pas, les commentaires vous sont ouverts…



Articles éventuellement en rapport:

7 Responses to “Combattre l’injection SQL”

  1. No' Says:

    teu teu teu…

    ZEU solution : ne plus développer “from scratch”, mais utiliser un framework. La plupart de ces problématiques - et même toutes les autres injections (JS, par exemple) ont déjà été traitées, elles sont pourchassées par des armées de codeurs qui ont le clavier entre les dents. Profitons de l’intelligence collective. Si ton framework préféré ne dispose pas de ce genre d’outils, laisse-le tomber comme une grosse chaussette de rugbyman après trois heures d’entraînement.

    Injection SQL, hein ?
    http://xkcd.com/327/

  2. Raphaël Rougeron Says:

    Les magic_quotes en PHP sont à oublier, c’était une fonctionnalité destinée à protéger les développeurs débutants, mais elle pose plus de problèmes qu’elle n’en résoud…

    Le plus sûr (en PHP5) reste d’utiliser PDO et les paramètres liés -> http://fr.php.net/pdo

  3. Damien Says:

    +1 pour mysql_real_escape_string(), +1 pour oublier les magic_quotes.

    Sinon bah la régle de base c’est en effet de toujours filtrer à fond les données que l’utilisateur peux passer à l’appli.

    Pour les procédures stockées je connais pas encore :P

  4. leGizz Says:

    +1 pour les framework + utilisateur spécifique + préfixe

    La photo c’est de toi ? En tout cas c’est bien déjanté, j’aime bien !

  5. Julien Tartarin Says:

    Bon à savoir aussi, mysql_query() ne passe qu’une seule requête au serveur.

    C’est pas grand chose mais ça limite énormément le champ d’action d’un éventuel script mal protégé.

  6. hm Says:

    d’ailleur en parlant de sql injection yen a une petite sur achetemoiuniphone.com
    si tu fais
    http://www.achetemoiuniphone.com/send.php?id=79%20and%201=1 on voit
    chérie, achète moi un iphone…
    Et je te fais un iGosse.
    par contre si je fais
    http://www.achetemoiuniphone.com/send.php?id=79%20and%201=0
    , achète moi un iphone…
    ce qui veut donc dire que l’on a bien injecter dans la requete AND 1=0 ou dans l’autre cas AND 1=1…
    et pour bien montrer
    http://www.achetemoiuniphone.com/send.php?id=-1%20union%20select%200,1,2,3,4/*

  7. babozor Says:

    @hm: owned… ou faites ce que je dis et pas ce que je fais… ;) damned!

Laissez un commentaire