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 :

besoin d'aide pour comprendre les injections sql


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 68
    Points
    68
    Par défaut besoin d'aide pour comprendre les injections sql
    Bonjour,
    je souhaite protéger mon site contre les injections sql et j'ai regardé cette page pour comprendre le fonctionnement.
    http://www.linux-pour-lesnuls.com/injection.php
    Je reprends les exemples de ce site:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("SELECT * FROM users WHERE utilisateur = '$login' AND motdepasse = '$password'");
    si dans le champ correspondant au login on met:
    la requete devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("SELECT * FROM users WHERE utilisateur = '' OR 1=1"); //' AND motdepasse = 'password'");
    password étant le contenu de la variable $password.

    Pourtant quand je le fais, le server mysql interprete la requete ainsi:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM users WHERE utilisateur = '' OR 1=1"); //' AND motdepasse = 'password'

    1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL
    server version for the right syntax to use near '"); //' AND motdepasse = 'password'' at line 1
    Le probleme c'est que mysql tente d'interpreter "); // alors que c'est à apache de le faire.
    Pourquoi le server mysql ne l'interprete-t-il pas ainsi?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM users WHERE utilisateur = '' OR 1=1

    Merci pour vos explications.
    Cassy

    [edit]merci julp pour avoir réediter mon post...j'y penserais la prochaine fois.
    effectivement c'est plus clair bien qu'il y ait encore aucune reponse [edit]

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    C'est pas 2 slashs pour mettre un commentaire en fin de requête, mais un dièse.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 68
    Points
    68
    Par défaut
    sauf que c'est bien // pour un commentaire php.
    le ferme le

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    tu dois avoir les magic quotes d'activés ce qui donne un fois posté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("SELECT * FROM users WHERE utilisateur = '' OR 1=1\"); //' AND motdepasse = 'password'");
    Bye

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Citation Envoyé par cassy
    sauf que c'est bien // pour un commentaire php.
    le ferme le
    Je ne parlais pas d'un commentaire php, mais d'un commentaire SQL.

    Et puis # est aussi un délimiteur de commentaire en php.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("SELECT * FROM users WHERE utilisateur='' OR 1=1 # AND motdepasse = 'password'");

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    le commentaire SQL c'est -- (suivi d'un espace avec MySQL).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mysql_query("SELECT * 
      FROM users 
      WHERE utilisateur = '$login' 
        AND motdepasse = '' OR 1=1 -- '");
    Echapper les apostrophes (comme il faut toujours faire), ou même ces immondes magic_quotes, te protègerait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mysql_query("SELECT * 
      FROM users 
      WHERE utilisateur = '$login' 
        AND motdepasse = ''' OR 1=1 -- '");

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 68
    Points
    68
    Par défaut
    ok merci je comprends mieux...
    Le site laissait sous entendre qu'on pouvait executer du code php après le ");
    ce qui n'a pas l'air d'être possible heureusement...
    on peut donc modifier les requetes par sql injection mais pas le traitement qu'il y a derrrière coté apache si j'ai bien compris.

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    PHP n'a pas de raison d'exécuter une variable (sauf s'il y a un eval() dans le script). Par contre, il envoie à MySQL des instructions où apparaissent les variables, d'où le risque d'injection.

    Le même risque existe si PHP envoie des commandes à l'OS avec ``.

  9. #9
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    C'est bizzare cet article, c'est nimp ^^
    A moins que j'aie loupé un truc ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/02/2013, 12h04
  2. Besoin d'aide pour comprendre une requête SQL
    Par MAXJEREM dans le forum SQL
    Réponses: 0
    Dernier message: 12/04/2011, 13h46
  3. besoin d'aide pour comprendre un exo simple de java
    Par chadel dans le forum Langage
    Réponses: 2
    Dernier message: 16/03/2007, 23h27
  4. Besoin d aide pour comprendre un code
    Par litlebasic dans le forum Delphi
    Réponses: 4
    Dernier message: 22/06/2006, 13h00
  5. Besoin d'aide pour recuperer les fichier d'un projet
    Par barthelv dans le forum Applications et environnements graphiques
    Réponses: 9
    Dernier message: 14/04/2006, 11h47

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