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 :

Prepare et Injection SQL


Sujet :

PHP & Base de données

  1. #1
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut Prepare et Injection SQL
    Salut all,

    Je me pose la question si l'utilisation de requete prepare empeche/parre toutes injections SQL ?
    (par prepare j'entends $mysqli->prepare ou mysqli_prepare)

    Merci pour vos infos.
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  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
    Ce n'est pas la fonction prepare() en elle même qui empêche les injections, c'est le fait de ne pas mettre les données potentiellement dangereuse dans la requête mais de les passer en paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_prepare('SELECT colonne FROM table WHERE colonne = ' . $_POST['id']); // pas bien
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Merci sabotage pour ta reponse, mais je parlais dans des conditions correctes d'utilisation
    (genre l'exemple http://php.net/manual/fr/mysqli.prepare.php)
    Donc si on fait comme l'exemple, ca empeche les injections ?
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  4. #4
    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
    Avec Mysql, il vaut mieux aussi desactiver l'emulation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre à l'essai
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2017
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Ce n'est pas la fonction prepare() en elle même qui empêche les injections, c'est le fait de ne pas mettre les données potentiellement dangereuse dans la requête mais de les passer en paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_prepare('SELECT colonne FROM table WHERE colonne = ' . $_POST['id']); // pas bien
    Mais en quoi le fait de passer les données potentiellement dangereuses en paramètre fait qu'elles ne le sont plus ? Et ne le sont-elles plus du tout, ou seulement un peu moins ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    il serait bon de lire la doc :


  7. #7
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Citation Envoyé par Supracode Voir le message
    Mais en quoi le fait de passer les données potentiellement dangereuses en paramètre fait qu'elles ne le sont plus ? Et ne le sont-elles plus du tout, ou seulement un peu moins ?
    Si j'ai tout compris (lol)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_prepare('SELECT colonne FROM table WHERE colonne = ' . $_POST['id']);
    Pas glop, car utilisation du $_POST['id'] directement dans le prepare.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mysqli_prepare('SELECT colonne FROM table WHERE colonne = ?');
    $con->bind_param('i', $_POST['id']);
    Glop, car le $_POST['id'] est en dehors de la cmd sql.
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Nom : glop.1283268437.thumbnail.jpg
Affichages : 278
Taille : 31,0 Ko

  9. #9
    Membre à l'essai
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2017
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,
    il serait bon de lire la doc :
    D'accord, c'est affirmatif :
    . Si votre application utilise exclusivement les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL n'est possibl
    Mais pas très explicite pour autant.

    Réceptionnons une variable pirate $_GET['cadeau']="DELETE 'everything' FROM 'la_totale' ".


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = $dbh->prepare ("INSERT INTO REGISTRY (cadeau) VALUES (:cadeau, :value)");
    $stmt->bindParam(':cadeau', $_GET['cadeau']);
    Pourquoi le fait d'utiliser une requête préparée neutralise-t'il la valeur piégée de la variable $_GET['cadeau'] ?
    Je ne me représente pas le truc.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Essaye, pour voir...

  11. #11
    Membre à l'essai
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2017
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Bah, ce n'est pas de constater le résultat qui va m'expliquer le mécanisme qui produit ce résultat


    T'sais pas en fait

  12. #12
    Invité
    Invité(e)
    Par défaut
    Si votre application utilise exclusivement les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL n'est possible
    Ca ME suffit comme explication.



    « Prévenir les injections requiert de séparer les données non sûres des commandes et requêtes. »

    Et ça tombe bien ; c'est très précisément ce que font les requêtes préparées : séparer les données de la structure de la requête !
    Dernière modification par Invité ; 21/04/2017 à 16h30.

  13. #13
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    [troll on]
    Trop fort le pifou
    [troll off]
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2017
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Je n'ai pas besoin de savoir comment fonctionne le moteur de ma voiture pour la conduire...


    Ca ME suffit comme explication.
    D'accord, ça me rassure.

    Mais ne me satisfait point pour autant.

    Bon alors, pour la science, quel genre de spécialité informatique faut-il pratiquer, pour être capable de répondre à la question susdite ? Est-ce du ressort exclusif des ingénieurs en base de donnée, par exemple ? Ou de celui des concepteurs du langage PHP (on les appelle comment) ? Ou est-ce que ça se passe côté serveur ?

    Je sais, je complique. Mais savoir comment tourne le moteur, c'est toujours intéressant.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Il me semble que le principe de fonctionnement est clair : "séparer les données non sûres des commandes et requêtes".

    LIRE aussi :

    L'exécution d'une requête préparée se déroule en deux étapes : la préparation et l'exécution.

    Lors de la préparation, un template de requête est envoyé au serveur de base de données.
    Le serveur effectue une vérification de la syntaxe, et initialise les ressources internes du serveur pour une utilisation ultérieure.

    Je ne vois pas ce que tu cherches d'autre...

  16. #16
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    La protection des requêtes préparée intervient parce que on sépare le programme à executer (la requête) des paramètres qui le compose.

    Prenons l'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $param = "1; DROP TABLE users;"
    $query  = "SELECT * FROM users where id=$param ";
    Si je fait une requête standard , je vais demander à mon serveur d'executer la requête : SELECT * FROM users where id=1; DROP TABLE users;Ce qui va résulter en là suppression de ma table ...

    Maintenant si je fait une requête préparée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $param = "1; DROP TABLE users;"
    $query  = "SELECT * FROM users where id=?";
    Le server SQL va "compiler" la requête à executer, qui va donc être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM users where id=
    puis y appliquer le paramètre qui sera
    Le serveur va donc simplement essayer de trouver un utilisateur avec l'id "1; DROP TABLE users;" et non pas interpréter celà comme une seconde requête collé à la première.
    La seul partie que le serveur execute est la partie que l'on prépare et non la partie paramètre qui pourrait potentiellement contenir d'autres instructions.

    Je ne sais pas comme ça marche en interne précisément , mais l'idée général est celle exposée plus haut

    Note que les requêtes préparées ne sont pas toujours indispensable. Dans l'exemple précédent , il suffit simplement de faire un intval() sur le paramètre attendu pour éviter tout problème. Elle sont en revanche très pratique dès que les paramètres passée sont textuelles et donc difficiles à controler
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #17
    Membre à l'essai
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2017
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Intéressant, j'ai compris, merci. +1

    Voyez, ça vaut le coup de détailler.

Discussions similaires

  1. [Sécurité] Injection SQL
    Par Michel_57 dans le forum Langage
    Réponses: 17
    Dernier message: 19/04/2006, 00h25
  2. Sécurité - Inject SQL et %
    Par bigsister dans le forum Requêtes
    Réponses: 14
    Dernier message: 01/04/2006, 09h34
  3. Réponses: 4
    Dernier message: 13/02/2006, 11h34
  4. Réponses: 20
    Dernier message: 03/02/2006, 10h55
  5. Réponses: 10
    Dernier message: 25/10/2005, 16h09

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