IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

protection contre les injections SQL


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2012
    Messages : 145
    Points : 88
    Points
    88
    Par défaut protection contre les injections SQL
    Bonjour,

    Je souhaite savoir quoi faire contre les injection sql, j'ai vue pas mal de chose sur le net, et je m'y perd un peut.

    Utilisez des requêtes préparées avec des variables liées. Elles sont disponibles avec PDO, MySQLi. Quoi choisir?

    j'utilse real_escape_string mais sa ne suffit pas car j'ai été victime d'une injection sql et maintenant des données non désirées s'insert dans ma base de données et une page de pub s'ouvre en cliquant sur un lien de mon site. Enfin, c'est chiant, je n'arrive à trouver les lignes de commande qui font ce bazar.

    Bonne journée

    cédric

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    mysql_real_escape_string() est suffisant.
    Si tu es victime d'un injection SQL, c'est que tu as une requête qui prend des données non protégées.
    Si tu en as la possibilité, tu peux activer le log des requêtes pour voir ou est le trou.

    Mais le problème peut venir d'ailleurs puisque tu n'as pas identifié l'origine.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    la première chose est de toujours vérifier ce que tu passes dans tes $_POST ou $_GET
    si tu attends un nombre tu récupère un nombre (avec intval ou floatval ou doubleval) ça évite nombre de problèmes vu que tu es sur d'avoir un nombre et pas une chaine à la place vu que php a un typage faible...

    pour les chaines de caractères il faut utiliser une regexp pour tester, tant que faire se peut, si le contenu est autorisé ou non... sur du texte libre ce n'est pas possible évidemment

    l'échappement, le remplacement ou la suppression des caractères interprétables coté mysql est ensuite un impératif... par exemple le caractère 0x0000 sert de fin de chaine dans certain cas, il est échappé mais en fait il n'a pas à exister dans nombre d'application et peut donc être supprimé sans plus de formalité la plupart du temps...

    pour les api préfère pdo, tu auras peu de changement si tu changes de sgbd un jour, sinon mysqli va très bien... les 2 ont grosso modo la même syntaxe (version objet de mysqli)

    l'utilisation de procédure stockée avec un contrôle coté sgbd de ce qui est envoyé en cas de texte (le typage du sgbd est fort, il y a peu de cast implicite permis) et un utilisateur qui n'a qu'un droit "grant execute" du coup un piratage du php ne compromet pas la bd vu que l'utilisateur mysql ne peut rien faire qu'appeler des procédures... donc si tu sécurises correctement les procédures qui font des insertions, suppression ou modifications tu empêches sa compromission...

    enfin toujours mettre les fichiers téléchargés par formulaire (ou ftp autres que par toi même) dans des répertoires où l'exécution est interdite... et ne jamais faire confiance à l'extension du fichier toujours tester que c'est un contenu valide

    toujours bien vérifier les droits d'accès et de modification des différents répertoires du site, empêcher qu'on puis lister leur contenu ou arborescence
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Salut,
    Moi ce que je fait c'est une fonction du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function checkInput($data, $pattern)
    {
       if(preg_match($pattern,$data) != 1)
       {
           die("Invalid data: $data");
       }
    }
    Ensuite pour pas m'embêter, j'autorise que a-aA-Z + 0-9 et -_ dans mes username. Pour le password, je le hash avant de faire quoi que ce soit, du coup pas besoin de s'embêter.

    L'idée est donc que chaque variable qui est envoyée en GET ou POST ne puisse pas contenir de code SQL.
    Le real_escape est une bonne idée aussi.

Discussions similaires

  1. protection contre les injections SQL
    Par Merling dans le forum Applications
    Réponses: 1
    Dernier message: 23/02/2010, 09h28
  2. [MySQL] Protection contre les injections
    Par hafcher dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/06/2008, 20h35
  3. Lutter contre les injections SQL
    Par EvilAngel dans le forum ASP
    Réponses: 4
    Dernier message: 15/06/2006, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo