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

Langage PHP Discussion :

mysql_real_escape_string et compagnie


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 151
    Par défaut mysql_real_escape_string et compagnie
    Bonjour,

    Voila, j'ai un formulaire avec un champ 'gamename'.
    Le formulaire envoi a une page de vérification 'verifFormulaire.php'.
    Dans cette page, je récupère le nom du membre avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $_SESSION['gamename'] = 
    mysql_real_escape_string(htmlentities($_POST['gamename']))
    Ensuite, je vérifie si la valeur de $_SESSION['gamename'] est dans la base via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...`gamName` LIKE '%".$_SESSION['gamename']."%'...
    et je récupère la liste des jeux.

    En haut de cette liste j'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'Jeux contenant : '.stripslashes($_SESSION['gamename']);
    Et éventuellement, je remet le texte entrer en valeur par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo '<input type="text" name ="gamename'" 
    value=" '.stripslashes($_SESSION['gamename']).' ">
    Si j'entre un ' dans le champ 'gamename', j'obtient bien la liste des jeux contenant ' dans le nom, et cela affiche Jeux contenant " ' ".

    si j'entre : <a href="nonSite">test</a>, j'obtient aucun jeux donc c'est normal, et cela affiche Jeux contenant "<a href="nonSite">test</a>"


    Donc
    1) Suis-je bien protéger de cette façon contre les injonctions sql ?
    2) Faut-il protéger l'envoi de donnée via une liste déroulante pré-rempli, il me semble que non, mais...
    3) la fonction addslash dans tout ça, elle sert a quoi ? sachant que tout les champs texte des formulaires sont nécessairement lié a une base de donnée dans mon cas.

    Merci,

  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
    Tu ne devrais pas utiliser les fonctions htmlentities avant d'inserer les données dans ta base.
    Pas pour une question de sécurité mais pour une question de données.
    En effet il n'y a pas de raison que le nom de ton jeu soit présent sous une forme HTML dans la base.
    C'est ensuite au moment de l'affichage que tu le convertis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'Jeux contenant : '.htmlentities($_POST['gamename']);
    Tu peux egalement utiliser strip_tags() pour nettoyer un peu ta chaine.

    Utilise effectivement mysql_real_escape_string() pour placer des variables externes dans une requete.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIKE '%".mysql_real_escape_string($_POST['gamename'])."%'...
    Pour ton stripslashes() il ne devrait pas être nécessaire ; si tu as des problemes d'antislash dans ta base de donnée c'est plutot au niveau de l'insertion qu'il faut le résoudre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 151
    Par défaut Et gérer le antislash ?
    Bonjour à nouveau,

    j'ai changer pas mal de truc dans mes requête etc, et voila ou j'en suit pour par exemple une requête insert.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $query = " 	
    INSERT INTO `user` (`useName`, `useEmail`, `usePassword`, 
    `useLocalisation`, `useFuseau`, `useInscription`, `useMAJ`)
    VALUES ('".utf8_encode(mysql_real_escape_string($_SESSION['userFourni']))."',
    '".utf8_encode(mysql_real_escape_string($_SESSION['emailFourni']))."',
    '".utf8_encode(mysql_real_escape_string($hashPassword))."',
    '".utf8_encode(mysql_real_escape_string($_SESSION['localisationFourni']))."',
    '".utf8_encode(mysql_real_escape_string($_SESSION['fuseauFourni']))."', 
    '".$quand."', '".$quand."')";
    avec ce code, si $_SESSION['userFourni'] = " <p'o"i/u\t"> "
    la chaine <p'o"i/u\t"> s'inscrit bien dans la base sql.

    Pour la connection a l'espace membre par exemple, si j'entre <p'o"i/u\t"> dans le champ du formulaire, et que je le récupère ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $query =" 
    SELECT *
    FROM `user`
    WHERE `useName` LIKE '".mysql_real_escape_string(addslashes($login))."' 
     AND `usePassword` LIKE '".mysql_real_escape_string(md5($password))."' ";
    tout fonctionne bien, j'entre bien dans la section membre.

    Je trouve un peu étrange de devoir faire un addslashes($login) avant de faire le mysql_real_escape_string, vous faite comme ça pour gérer les anti-slashs ?

    Finalement ça fait plein de fonction dans une requête sql, c'est pas super joli

  4. #4
    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
    Je trouve un peu étrange de devoir faire un addslashes($login)
    pourquoi le fais-tu ?

    Pareil pour le utf8_encode, tu ferrais mieux d'harmoniser tes encodages.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 151
    Par défaut
    D'abord merci pour ton aide,

    Pour le addslash :
    Si un $login du genre est dans la bd: <p'o"i/u\t">. C'est exagérer mais c'est pour tester

    et la récupération avec le post['login'] n'affiche rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $login = $_POST['login'];
    echo $login; //affiche rien
    echo mysql_real_escape_string($login); //affiche rien

    donc je n'est pas trouver la façon de passer un $login avec un \ via un $_post, pour exécuter un SELECT.

    Par contre, étrangement ce code exécute bien le SELECT et retourne les bon résultats.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $query =" 
    SELECT *
    FROM `user`
    WHERE `useName` LIKE '".mysql_real_escape_string(addslashes($login))."' 
     AND `usePassword` LIKE '".mysql_real_escape_string(md5($password))."' ";
    Pour l'encodage,

    chaque champ texte dans la base de donnée est en utf8_unicode_ci.
    j'ai aussi dans mes script php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $bdd = mysql_connect("localhost","root","blablabla") or die(mysql_error());
    mysql_query("SET NAMES 'utf8'");
    mysql_select_db("nombase",$bdd) or die(mysql_error());
    et dans les métas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
    sans le utf8_encode j'avais des caractère bizarre dans ma table, notamment des 㨠machin a la place de ô.

    pourtant, ça me semble du utf-8 partout non ?

  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
    dans ta chaine <p'o"i/u\t"> c'est le < qui fait que rien ne s'affiche puisque le navigateur le considere comme un début de tag html.

    Vois bien que addslashes() et mysql_real_escape_string() font a peu pres la meme chose.
    Toi tu n'as pas besoin de addslashes.
    Si tu dois afficher une chaine avec des < ou des guillemets, il faut utiliser htmlspecialchars().

    Pour tes problemes d'encodage, lance la requete "SET NAMES 'UTF8'" au début de ton code et enleve tes utf8_encode, ca devrait marcher.
    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. ArrayList et compagnie
    Par BernardT dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 30/01/2006, 23h27
  2. [SGBD] Utilisation de mysql_real_escape_string()
    Par Space Cowboy dans le forum Requêtes
    Réponses: 1
    Dernier message: 27/11/2005, 10h24
  3. [MySQL] [SGBD] [mssql] Equivalent mysql_real_escape_string pour mssql
    Par PoZZyX dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/10/2005, 11h37
  4. [ADO] Problème avec MoveLast et compagnie
    Par Odulo dans le forum Access
    Réponses: 2
    Dernier message: 28/09/2005, 09h27
  5. JOnAS, JBoss vs Websphere et compagnie..
    Par kaishef dans le forum Wildfly/JBoss
    Réponses: 9
    Dernier message: 18/05/2005, 17h57

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