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 :

Insertion SQL [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Par défaut Insertion SQL
    Bonsoir à tous,

    je vous explique mon problème: je dois créer une application web pour gérer des stages pour une association. L'architecture html est faite, il me reste 'simplement' à ajouter du code php là-dessus.
    J'y arrive à peu près, qu'il s'agisse d'interroger la base ou de modifier certains champs.
    On m'a dit qu'il fallait _absolument_ protéger les champs texte des insertions SQL. Je ne vois pas tellement qui serait intéressé par ma base de données, mais sur de l'expérience des internautes, je vous fais confiance.
    C'est à ce moment que ça coince: je peux modifier/interroger la base sans problème si les champs ne contiennent que du texte, mais si j'ajoute le caractère " (double quote), la saisie saute! Ceci, sans faire appel à une fonction de protection SQL. Ce qui m'ennuie, c'est que les utilisateurs doivent pouvoir utiliser les double quotes et autres caractères exotiques dans leur saisie (il n'est pas imaginable de leur dire qu'ils ne peuvent pas utiliser tel ou tel caractère).

    Voici un bout du code:
    - la récupération des infos saisies sur la page précédente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $id_poste=$_POST["id_poste"]; //l'identifiant du stage choisi
    $structure = ucwords($_POST['structure']); // variable 'structure'
    $departement = ucwords($_POST['departement']); // variable 'departement'
    $pole = $_POST['pole']; // variable 'pole'
    $adresse_structure = $_POST['adresse_structure']; // var 'adresse_structure'
    $cp_structure = $_POST['cp_structure']; // variable 'cp_structure'
    $ville_structure = ucwords($_POST['ville_structure']); // var 'ville_structure'
    $resp_prenom = ucwords($_POST['resp_prenom']); // variable 'resp_prenom'
    $resp_nom = ucwords($_POST['resp_nom']); // variable 'resp_nom'
    $resp_mail = $_POST['resp_mail']; // 'resp_mail'
    $resp_tel = $_POST['resp_tel']; // 'resp_tel'
    - et enfin la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $query_update_poste = sprintf(
    "UPDATE base.stages 
    SET structure = '$structure', 
    departement = '$departement', 
    pole = '$pole', 
    adresse_structure = '$adresse_structure', 
    cp_structure = '$cp_structure', 
    ville_structure = '$ville_structure', 
    resp_prenom = '$resp_prenom', 
    resp_nom = '$resp_nom', 
    resp_mail = '$resp_mail', 
    resp_tel = '$resp_tel' 
    WHERE id_poste = '$id_poste'");
    Il s'agit sûrement d'une erreur de débutant, j'ai cherché pendant plusieurs heures une réponse sur google, sans trouver. Y compris en utilisant la fonction suivante, glanée sur le site php.net:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function quote_smart($value)
    	{
    		if(get_magic_quotes_gpc()) {
    			$value = stripslashes($value);
    		}
    		return addslashes($value);
    	}
    Merci infiniment de votre aide!!

    T.

  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
    Par défaut
    L’échappement des chaînes de caractères sert effectivement a empêcher les injections sql mais aussi a échapper les guillemets normaux de la chaîne.

    avec l'extension mysql_ on utilise la fonction mysql_real_escape_string()
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Par défaut
    Citation Envoyé par sabotage Voir le message
    L’échappement des chaînes de caractères sert effectivement a empêcher les injections sql mais aussi a échapper les guillemets normaux de la chaîne.

    avec l'extension mysql_ on utilise la fonction mysql_real_escape_string()
    Merci de ta réponse.
    Cependant j'avais essayé d'utiliser la fonction mysql_real_escape_string(), qui n'a pas résolu mon problème: si $departement vaut : Unité "bidule", le texte bidule disparaît avec les double quotes...

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par tarlito Voir le message
    Merci de ta réponse.
    Cependant j'avais essayé d'utiliser la fonction mysql_real_escape_string(), qui n'a pas résolu mon problème: si $departement vaut : Unité "bidule", le texte bidule disparaît avec les double quotes...
    normale non ?

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    normale non ?
    Ben justement, il me semble que oui, mais je voudrais pouvoir les garder - ou les remplacer - pour que rien de la saisie ne saute (sans toutefois risquer une insertion malintentionnée). Et que si un utilisateur précise qu'il s'agit du département "Bidule", l'interrogation de la base (dans une autre page) me précise qu'il s'agit bien du département "Bidule". Sachant que les doubles quote m'importent peu.
    Peut-être que ce n'est pas possible?
    Je suis plutôt sur le versant débutant, alors je rame un peu...

  6. #6
    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
    Par défaut
    Est-ce que c'est bien a l'insertion que le texte est tronqué ?

    Si tu essaies d'inserer une chaine avec les mauvais guillemets, ta requete ne fonctionnera pas, donc rien ne sera insérer ; il faut utiliser une fonction comme myslq_real_escape_string().

    Si tu essaies d'afficher une chaine avec les mauvais guillemets dans un input, le texte sera tronqué au guillemet fautif ; il faut utiliser une fonction comme htmlentities.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre chevronné Avatar de rikemSen
    Homme Profil pro
    Analyste Développeur Web - Fizzup.com
    Inscrit en
    Décembre 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 387
    Par défaut
    Utilisons les bons termes... On t'as demandé d'éviter "l'injection" SQL (et non l'insertion). (juste pour petite correction ^^)

    Je pense que le plus simple à faire est de passer toute ta chaine ($_POST['text_utilisateur']) dans htmlentities (qui convertira tous les caractères spéciaux en caractères HTMl)

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Est-ce que c'est bien a l'insertion que le texte est tronqué ?
    Merci! En effet je n'ai pas vérifié cela. Je regarde ça ce soir et je te donne des nouvelles.

    Citation Envoyé par radicaldreamer Voir le message
    Utilisons les bons termes... On t'as demandé d'éviter "l'injection" SQL (et non l'insertion). (juste pour petite correction ^^)
    Oui, c'est vrai. Je rame donc plus que je ne le pensai!
    Citation Envoyé par radicaldreamer Voir le message
    Je pense que le plus simple à faire est de passer toute ta chaine ($_POST['text_utilisateur']) dans htmlentities (qui convertira tous les caractères spéciaux en caractères HTMl)
    Cela dès le script d'insertion dans la base, ou simplement à l'affichage?
    Je vérifie la base après l'insertion et je vous dit ce qui se passe avec l'utilisation des deux fonctions que vous m'avez proposées.
    Merci en tout cas pour les tuyaux!

  9. #9
    Membre chevronné Avatar de rikemSen
    Homme Profil pro
    Analyste Développeur Web - Fizzup.com
    Inscrit en
    Décembre 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 387
    Par défaut
    lors de l'ajout du texte dans la base de données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query('INSERT INTO table VALUES('.htmlentities($_POST['texte']).')');
    Et lors de la récupération des données pour l'affichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo html_entity_decode($var['texte']);

  10. #10
    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
    Par défaut
    Ca serait absurde de mettre des entités HTML dans la base de donnée et de les retirer quand on est dans la page HTML.

    La bonne méthode est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query('INSERT INTO table VALUES("'.mysql_real_escape_string($_POST['texte']).'")');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo htmlspecialchars($var['texte']);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Par défaut
    Bon alors j'ai essayé plusieurs techniques...
    Une seule fonctionne: addslashes()

    En gros, je modifie le code comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $resp_prenom = addslashes(ucwords($_POST['resp_prenom']));
    ça fonctionne. La base est bien modifiée, et si resp_prenom = 'toto', alors dans la base figure 'toto' (que je peux afficher tel quel).
    Par contre, si je mets "toto" la valeur est vide. Les autres modifications de la base sont cependant enregistrées.
    Si je change pour mysql_real_escape_string(ucwords($_POST['resp_prenom']),$Connexion);, avec 'toto' tout fonctionne mais il ne prend pas les double quote , comme avec addslashes.

    J'en conclus qu'il y a un problème avec les double quote, non?
    Seul problème, je n'arrive pas à les remplacer avec str_replace() ...
    Pouvez-vous m'expliquer?

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

Discussions similaires

  1. [MySQL] Problème d'apostrophes dans insertion sql
    Par 12_darte_12 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 30/05/2006, 16h20
  2. [Conception] insertion sql en php, dans une base de donnée ?
    Par artotal dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/10/2005, 04h34
  3. Lenteur lors d'une insertion (sql server)
    Par shiners300 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 16/09/2005, 09h09
  4. Réponses: 24
    Dernier message: 31/05/2005, 15h07
  5. Export sous forme d'INSERT SQL
    Par Kraken dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/09/2003, 11h40

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