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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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