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

C Discussion :

L'api mysql en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut L'api mysql en C
    Bonjour.

    Je n'arrive pas à passer une variable dans ma requete, erreur de syntaxe?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char recu[10]="tomate";
    mysql_query(conn,"SELECT * FROM article WHERE article='recu'");
    Tandis que si je lui passe directement 'tomate' ça fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query(conn,"SELECT * FROM article WHERE article='tomate'");
    Une idée merci...

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut Trouvé !
    Voilà la réponse si ça interesse quelqu'un, on sait jamais .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sprintf(varsortie,SELECT * from article where article=('%s')", recu);
    mysql_query(conn,varsortie);

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Citation Envoyé par dashed Voir le message
    Voilà la réponse si ça interesse quelqu'un, on sait jamais .
    C'est ce qu'il y a de plus simple à première vue mais c'est une pratique fortement déconseillée par tout le monde, parce que c'est une des principales causes d'injection SQL, spécialement si le programmeur n'est pas sensibilisé à ce problème.

    Dans le cas le moins grave, que se passerait-il, par exemple, si le mot que tu recherches et qui est inscrit dans « recu » contient une apostrophe ? Ta requête deviendrait syntaxiquement incorrecte et ça suffirait à faire planter ton programme. Dans le pire, si le mot à rechercher est saisi au préalable par l'utilisateur, il suffit d'écrire dans le champs de recherche un fragment de requête SQL qui complète l'existante et en profite pour passer d'autres ordres. Il faut alors utiliser des filtres de nettoyage ou « assainissement » (sanitize en anglais) pour mettre les bons caractères d'échappement aux éventuels caractères spéciaux qui auraient pu être transmis.

    C'est une attaque très fréquente qui a été rendue célèbre en son temps par ce non moins célèbre strip signé XKCD : Exploits of a mom.

    Cependant, c'est loin d'être la panacée. Tous les professionnels et amateurs avertis te diront qu'il vaut mieux utiliser « prepare » pour enregistrer une requête en passant des paramètres positionnels, puis en liant ces positions à tes variables. Ainsi, tu sépares explicitement la donnée à traiter de la requête SQL elle-même et, en prime, cela évite au serveur de ré-analyser la requête à chaque passage.

    Regarde du côté de mysql_stmt_prepare.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut
    Merci beaucoup, pour cette réponse complete. Je n'avais absolument pas envisagé ce cas de figure je te remercie de m'avoir averti.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Pourquoi est ce que recu devrait être interprété comme une variable alors que tomate est laissée en string litteral, dans la requête ? Il n'y a pas de raison à cela. Il faut donc effectivement construire une chaîne avec snprintf de cette façon Il manque d'ailleurs le guillemet ouvrant.

Discussions similaires

  1. Api mysql avec Devc++, erreur de compilation
    Par Viiince dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 15/06/2004, 17h19
  2. [MFC] [API mySQL] Sous requêtes
    Par Guybrush113 dans le forum MFC
    Réponses: 5
    Dernier message: 29/04/2004, 16h14
  3. API MySQL - Connexion réseau
    Par klael dans le forum Bases de données
    Réponses: 3
    Dernier message: 18/03/2004, 09h25
  4. Utilisation des API MySQL // ADO ou BDE ? (sujet 2)
    Par rohstev dans le forum C++Builder
    Réponses: 8
    Dernier message: 07/11/2003, 10h50
  5. [DevC++]Installation de l'API MySQL
    Par Nasky dans le forum Dev-C++
    Réponses: 22
    Dernier message: 24/07/2003, 22h40

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