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

 MySQL Discussion :

insérer un apostrophe dans MySQL


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut insérer un apostrophe dans MySQL
    Bonjour,

    je débute dans la programmation PHP/MySQL, tout se passait bien jusqu'à ce que je tombe sur un problème qui parrait simple mais que je n'arrive pas à résoudre avec les tutoriaux.

    J'ai fait un formulaire html et je vérifie que le champ pseudo n'existe pas dans la base de donnée. Pour éviter les attaques d'injection SQL, j'utilise la fonction proposée sur php.net "quote_smart".

    Je l'ai bien remarqué en faisant des echo, avec cette fonction des antislashs sont ajoutés lorsque j'écris un ' par exemple. Par contre, l'antislash n'est pas reporté dans ma requête SQL, et j'obtiens une erreur. Mon but est justement de faire la requête avec l'antislash, et surtout de ne pas avoir cette erreur.

    Dans le message d'erreur MySQL je vois bien qu'il n'y a plus mon antislash avant l'apostrophe dans ma requête

    Comment faire pour qu'il reste et donc que ma requête devienne valide ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    La seule façon d'éviter une injection sql est de passer tes variables par mysql_real_escape_string(). Toute autre fonction est insuffisante.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut
    Oui c'est ce que je fais, voici la fonction utilisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function quote_smart($value)
    {
       // Stripslashes
       if (get_magic_quotes_gpc()) {
         $value = stripslashes($value);
       }
       // Protection si ce n'est pas un entier
       if (!is_numeric($value)) {
         $value = "'" . mysql_real_escape_string($value) . "'";
       }
       return $value;
    }

  4. #4
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    C'est normal que le slash disparaisse une fois tes données dans la base.

    Sinon
    j'obtiens une erreur.
    Quel erreur ? où ? quand ? comment ? pourquoi ? avec qui ? ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $pseudo=(quote_smart($pseudo));
     
    $sql=mysql_query("SELECT * FROM membres WHERE pseudo like $pseudo");
    J'obtiens l'erreur suivante lorsque $pseudo = l'horreur :

    Erreur SQL !INSERT INTO membres(id, pseudo, pass, email, ne_le) Values('', 'l'horreur', '1234', 'lalala@lalala.com', '1916-06-01', '', '', '', '', '', '2006-02-08')
    Erreur de syntaxe près de 'horreur', '1234', 'lalala@lalala.com', '1916-06-01', '', '', '',' à la ligne 1
    On voit bien qu'il n'y a plus mon antislash avant l'apostrophe de l'horreur.

    Comment faire pour qu'il reste et donc que ma requête devienne valide ?

  6. #6
    Membre chevronné Avatar de XtofRoland
    Profil pro
    Inscrit en
    Août 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 357
    Par défaut
    tu dois obtenir ca:
    INSERT INTO membres(id, pseudo, pass, email, ne_le) Values('', 'l''horreur', '1234', 'lalala@lalala.com', '1916-06-01', '', '', '', '', '', '2006-02-08')
    un quote protège l'autre
    tu fait comme tu veux mais il faut doubler les ' des values
    pos; substring, erege_replace... magical_quote....

  7. #7
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Tu dois pas etre bien reveillé ce matin... Le code que tu nous montre est un SELECT alors que l'erreur se produit sur un INSERT

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut


    Je crois que j'ai compris mon erreur Je vais tester ce soir.

    Merci à tous

  9. #9
    Membre expérimenté
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    Si tu ne met pas de html dans mysql (par exemple pour ensuite afficher du code html) tu peux simplement remplacer les apostrophes par l'equivalent ascii HTML.

    Fonction qui convertit ', ", < et > en ascii html
    htmlentities($str, ENT_QUOTES);

    ensuite la fonction qui faits l'inverse :
    html_entity_decode($str, ENT_QUOTES);

    PS : attention a l'utf8.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut
    J'ai lu à plusieurs reprises qu'il est meilleur d'utiliser mysql_real_escape_string pour des questions de sécurité... Et je place du code html dans ma base, justement !

    Sinon mon erreur n'était pas au niveau de l'échappement des caractère, qui se faisait correctement, mais au niveau de mon cerveau. Je n'avais pas compris que le message d'erreur MySQL concernait une autre requête SQL que je n'ai pas citée et qui n'a rien à voir

    Je me doutais bien que c'étais un truc tout bête, mais quand on a pas l'habitude on peut y gaspiller des heures

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Insérer un vecteur dans MySQL avec PHP
    Par fAdoua123 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 21/02/2008, 17h50
  2. [XPath] Insérer une apostrophe dans un chemin
    Par slyer dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 17/04/2007, 09h52
  3. [Débutant]insérer une image dans Mysql
    Par olivier94 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 05/02/2007, 11h08
  4. [RegEx] Insérer une date dans MYSQL
    Par pony99 dans le forum Langage
    Réponses: 7
    Dernier message: 14/11/2006, 18h51
  5. Insérer une apostrophe dans une String
    Par plutonium719 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/08/2006, 11h02

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