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 :

' (apostrophe) lors de insert et update


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Points : 14
    Points
    14
    Par défaut ' (apostrophe) lors de insert et update
    bonjour

    Permettez-moi de faire appel à la communauté des développeur PHP/MYSQL

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $q = "INSERT INTO `$db_name`.`annonces` (
    `id` , 
    `add_date` , 
    `modify_date` , 
    `ind_type` , 
    `matiere` , 
    `nom` , 
    `dimensions` , 
    `poids` , 
    `description` , 
    `prix` , 
    `date_creation` , 
    `oeuvre_originale` , 
    `port_automatique` , 
    `type_reproduction`)
     
    VALUES (NULL , 
    NOW( ) , 
    NOW( ) , 
    '".eschtml($_POST[ind_type])."', 
    '".eschtml($_POST[matiere])."', 
    '".eschtml($_POST[nom])."', 
    '".eschtml($_POST[dimensions])."', 
    '".eschtml($_POST[poids])."', 
    '".eschtml($_POST[description])."', 
    '".eschtml($_POST[prix])."', 
    '".eschtml($_POST[date_creation])."', 
    '".eschtml($_POST[oeuvre_originale])."', 
    '".eschtml($_POST[port_automatique])."', 
    '".($_POST[type_reproduction])."' 
    );";
    Lorsque dans un des champs, je mets un ' (apostrophe) l'insert se passe mal, j'ai une erreur date base. Lorsqu'il n'y a pas de ' (apostrophe), tout se passe bien, l'insert est OK.
    Est-ce un problème de version PHP ?
    Pour info, je viens de passer de 1and1.fr vers infomaniak.ch.

    Voici mes codes header :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    Version PHP 5.4
    mysql Version 5.5.x

    Serveur INFOMANIAK

    Pourriez-vous m'aider svp ?

    Merci pour votre collaboration.

    Bone journée

    Eric Rouyer

  2. #2
    En attente de confirmation mail
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 217
    Points
    217
    Par défaut
    Bonjour,
    c'est quoi le code de votre fonction eschtml ?!

    normalement cette fonction doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function eschtml($data) {
        return mysql_real_escape_string($data);
        // ou return mysql_escape_string($data);
    }
    regarde si ça marche maintenant avec des champs contenant (')

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Et d'ailleurs tu devrais également utiliser cette fonction pour protéger la dernière variable $_POST[type_reproduction]). Même si c'est un entier, étant donné que tu ne contrôle pas cette donnée avant de l'insérer dans ta requête, cette requête est vulnérable aux injection sql.

    Si tu utilise Mysql, toutes les variables devraient être protégées par mysql_real_escape_string() comme l'a indiqué ouss_sk8.

    P.S Il est conseillé de mettre des quotes ou des doubles quotes dans les index de tes variables super globales par exemple $_POST["type_reproduction"] (et plus généralement dans tous les index des tableaux comprennent les caractères alphabétiques).

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    bonjour ABCIWEB et ouss_sk8 et merci de l'intérêt que vous portez à mon problème.

    J'ai mis en pratique le code de ouss_sk8

    C'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function eschtml($data) {
    return mysql_real_escape_string($data);
    // ou return mysql_escape_string($data);
    }
    Mais cela ne fonctionne pas si je mets un ' dans un champ de mon formulaire. J'ai cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "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 "
    Voici comme demandé par ouss_sk8 mon code de ma fonction eschtml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function eschtml($str){
            return str_replace("line_break_space", "<br />", htmlentities(str_replace(array("\r\n", "\n", "\'", "\r"), 'line_break_space', $str)));
      }

    Si je reviens sur les conseils de ABCIWEB je devrais remplacer dans mon INSERT ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '".eschtml($_POST[surface])."',
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '".eschtml($_POST["surface"])."',

    Pourriez-vous m'indiquer comment le coder pour ne plus avoir de problème ?

    Merci pour votre aide et bonne soirée

    Eric

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Houla, ça nous rajeuni pas ton code. Depuis le temps qu'on dit de ne pas utiliser htmlentities pour insérer des données en bdd...

    Ta fonction est très spécifique, il faut ne l'appliquer que sur les champs qui le demandent. Je parlais de mysql_real_escape_string() uniquement. Sur quel champ se pose le problème ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    en fait cette partie de code m'avait été préparé par un étudiant il y a très longtemps.

    En fait chaque champ alpha est susceptible d'avoir un ', les voici.

    ici pour la partie INSERT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    '".eschtml($_POST[adr])."', 
    '".eschtml($_POST[type])."', 
    '".eschtml($_POST[description])."', 
    '".eschtml($_POST[facade])."', 
    '".eschtml($_POST[caracteristiques])."', 
    '".eschtml($_POST[viabilite])."', 
    '".eschtml($_POST[divers])."',
    Mais je me rends compte que j'ai aussi le problème avec l'UPDATE : (voici le code pour l'update). Et dans l'update, j'utilise pas la fonction eschtml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    "UPDATE `annonces` SET 
    `modify_date` = NOW( ) ,
    `ref` = '$_POST[ref]',
    `adr` = '$_POST[adr]',
    `type` = '$_POST[type]',
    `surface` = '$_POST[surface]',
    `description` = '$_POST[description]',
    `facade` = '$_POST[facade]',
    `caracteristiques` = '$_POST[caracteristiques]',
    `viabilite` = '$_POST[viabilite]',
    `divers` = '$_POST[divers]',
    `prix` = '$_POST[prix]',
    `exclusivite1` = '$_POST[exclusivite1]',
    `exclusivite2` = '$_POST[exclusivite2]',
    `dpe` = '$_POST[dpe]',
    `ges` = '$_POST[ges]',
    `date_entree` = '$_POST[date_entree]'
    WHERE `annonces`.`id` = $_POST[id] LIMIT 1 ;";
    Donc comment faire pour que lors de la création (insert) et modification (update) tout fonctionne correctement.

    Là, je coince un peu

    Merci encore

    Eric

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Et sur ton précédent hébergement, ton code fonctionnait correctement ?

    Si oui, il faudrait regarder la différence des versions php et de configuration serveur, ça pourrait nous aiguiller. Il est probable que ce soit une histoire de guillemets magiques qui a été supprimée depuis php 5.4. Dans ce cas il suffirait de rajouter la fonction addslashes devant chacune des variables que tu passe dans ta requête pour avoir l'équivalent des guillemets magiques. Y compris dans ta requête d'insertion.

    Mais dans une requête utilisant l'extension mysql il est recommandé d'utiliser mysql_real_escape_string qui protège mieux la requête :
    Citation Envoyé par manuel php
    Pour échapper les paramètres de base de données, vous devez utiliser les fonctions d'échappement spécifiques à votre base de données (i.e. mysql_real_escape_string() pour MySQL ou pg_escape_literal(), pg_escape_string() pour PostgreSQL) et ce, pour des raisons de sécurité.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
     
    function eschtml($str){
            return str_replace("line_break_space", "<br />", htmlentities(str_replace(array("\r\n", "\n", "\'", "\r"), 'line_break_space', $str)));
      }
     
    //...
    //...
     
    $q = "INSERT INTO `$db_name`.`annonces` (
    `id` , 
    `add_date` , 
    `modify_date` , 
    `ind_type` , 
    `matiere` , 
    `nom` , 
    `dimensions` , 
    `poids` , 
    `description` , 
    `prix` , 
    `date_creation` , 
    `oeuvre_originale` , 
    `port_automatique` , 
    `type_reproduction`)
     
    VALUES (NULL , 
    NOW( ) , 
    NOW( ) , 
    '".eschtml(mysql_real_escape_string($_POST['ind_type']))."', 
    '".eschtml(mysql_real_escape_string($_POST['matiere']))."', 
    '".eschtml(mysql_real_escape_string($_POST['nom']))."', 
    '".eschtml(mysql_real_escape_string($_POST['dimensions']))."', 
    '".eschtml(mysql_real_escape_string($_POST['poids']))."', 
    '".eschtml(mysql_real_escape_string($_POST['description']))."', 
    '".eschtml(mysql_real_escape_string($_POST['prix']))."', 
    '".eschtml(mysql_real_escape_string($_POST['date_creation']))."', 
    '".eschtml(mysql_real_escape_string($_POST['oeuvre_originale']))."', 
    '".eschtml(mysql_real_escape_string($_POST['port_automatique']))."', 
    '".mysql_real_escape_string($_POST['type_reproduction'])."' 
    )";
     
    //...
    ?>
    J'ai pas utilisé "eschtml" sur la dernière variable car tu ne l'utilise pas dans ton premier code (et cela te donne aussi un exemple pour ta requête update).

    Si cela marche, la mauvaise nouvelle pour toi c'est que pour faire bien les choses il faudrait que tu reprenne toutes tes requêtes du site pour utiliser mysql_real_escape_string sur toutes les variables de tes requêtes suivant le modèle ci-dessus.

    Si les variables ne contiennent pas de quote ou de double quote ça pourra fonctionner sans cela mais tu t'expose à des failles de sécurité (voir injection sql exemple n°2).

    "magic_quotes_gpc" a été supprimée car cela permettait de faire des requêtes sans se préoccuper d'utiliser une fonction spécifique pour protéger les variables gpc ($_GET,$_POST,$_COOKIE) inclues dans la requête. Au niveau fonctionnel c'était correct mais pas optimisé contre le piratage.

    Tu pourrais aussi essayer de repasser en php 5.3 pour pouvoir réactiver l'option des guillemets magiques. Mais cela ne règlera pas pour autant les problèmes de sécurité. Après tu vas me dire qu'ils existaient bien avant sans que cela pose problème. Faut dire que si ton code n'est pas public ça limite quand même les risques mais les pirates peuvent essayer des attaques génériques, ou essayer de provoquer des erreurs pour dévoiler un peu la structure de ta bdd etc, etc. Ou peut être personne n'a essayé de te pirater. Donc en bref ça peut fonctionner mais tu cours clairement plus de risques.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    A propos des différents hébergement, cela fonctionnait sur OVH et 1and1.fr. (j'ai du par des raison d'économies et de performance quitter les 2) Par contre 1and1.com au states cela ne marche pas. C'est à s'arracher les cheveux.

    En tout cas, je te suis sincèrement reconnaissant de l'aide que tu m'apportes.

    J'ai adapté un champ avec ta proposition comme ceci et cela fonctionne nickel à l'INSERT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    $q = "INSERT INTO `$db_name`.`annonces` (
    `id` , 
    `add_date` , 
    `modify_date` , 
    `ind_type` , 
    `ref` , 
    `adr` , 
    `type` , 
    `surface` , 
    `description` , 
    `facade` , 
    `caracteristiques` , 
    `viabilite` , 
    `divers` , 
    `prix` , 
    `exclusivite1` , 
    `exclusivite2` , 
    `dpe` , 
    `ges` , 
    `date_entree`)VALUES (NULL , 
    NOW( ) , 
    NOW( ) , 
    '$_POST[ind_type]', 
    '$_POST[ref]', 
    '$_POST[adr]', 
    '".eschtml($_POST[type])."', 
    '".eschtml($_POST[surface])."', 
    '".eschtml(mysql_real_escape_string($_POST['description']))."', 
    '".eschtml($_POST[facade])."', 
    '".eschtml($_POST[caracteristiques])."', 
    '".eschtml($_POST[viabilite])."', 
    '".eschtml($_POST[divers])."', 
    '".eschtml($_POST[prix])."', 
    '".eschtml($_POST[exclusivite1])."', 
    '".eschtml($_POST[exclusivite2])."', 
    '".eschtml($_POST[dpe])."', 
    '".eschtml($_POST[ges])."', 
    '$_POST[date_entree]');";
    Par contre à l'affichage , c'est pas nickel, regarde l'image : Nom : affichage-apres-INSERT.jpg
Affichages : 1901
Taille : 53,5 Ko,
    c'est pas top, ai-je oublié quelques chose ?

    Pour la partie modification, ai fait la même chose au niveau code. et là, au niveau affichage, cela fonctionne nickel. regarde l'image en dessous du code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $q = "UPDATE `annonces` SET 
    `modify_date` = NOW( ) ,
    `ref` = '$_POST[ref]',
    `adr` = '$_POST[adr]',
    `type` = '$_POST[type]',
    `surface` = '$_POST[surface]',
    `description` = '".mysql_real_escape_string($_POST['description'])."' ,
    `facade` = '$_POST[facade]',
    `caracteristiques` = '$_POST[caracteristiques]',
    `viabilite` = '$_POST[viabilite]',
    `divers` = '$_POST[divers]',
    `prix` = '$_POST[prix]',
    `exclusivite1` = '$_POST[exclusivite1]',
    `exclusivite2` = '$_POST[exclusivite2]',
     
    `dpe` = '$_POST[dpe]',
    `ges` = '$_POST[ges]',
     
    `date_entree` = '$_POST[date_entree]'
    WHERE `annonces`.`id` = $_POST[id] LIMIT 1 ;";
    Nom : affichage-apres-UPDATE.jpg
Affichages : 2115
Taille : 51,3 Ko

    Je vais donc adapter tous les champs qui serait susceptible de recevoir un '

    Aurais-tu une idée pour ce problème, qui n'est pas vraiment un problème.

    Merci beaucoup en tout cas

    Eric

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Ce doit être un problème de redondance entre mysql_real_escape_string et htmlentities qui est utilisé dans ta fonction eschtml. Essayes d'inverser l'ordre d'application des fonctions pour voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_real_escape_string(eschtml($_POST['description']))
    Mais pourquoi n'appliques-tu pas "mysql_real_escape_string" sur toutes les variables de la requête ?

  10. #10
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Utilise une requête préparée http://php.net/manual/fr/mysqli.quic...statements.php

    A+.

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/07/2012, 11h53
  2. Exception lors de insert, update et delete
    Par haykelFST dans le forum PL/SQL
    Réponses: 3
    Dernier message: 02/05/2012, 17h24
  3. Apostrophe lors de la saisie et problème avec insert
    Par angelevil dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/06/2009, 21h54
  4. Réponses: 1
    Dernier message: 27/05/2009, 20h16
  5. [MySQL] Présence d'une apostrophe lors d'une insertion
    Par snaxisnake dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 15/09/2008, 11h10

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