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 :

Quotes, cookies, et sessions [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut Quotes, cookies, et sessions
    Bonjour,

    Désolé pour le titre pas très explicite.

    En fait je viens de mettre en ligne mon site avec un espace membre.

    J'avais pas vraiment prévu le cas où les membres mettraient des quotes ( ' ) dans leurs pseudos.

    Biensûr, le premier membre qui s'inscrit met des quotes dans son pseudo.

    J'ai modifié le code de mon inscription et de connexion avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Pseudo = $this->connexion->real_escape_string($Pseudo);
    L'inscription et la connexion fonctionnent bien. Dans ma base je vois bien par exemple user : bob\'63 par exemple

    Sur ma page d'accueil, lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bienvenue <?php echo $_SESSION['login']; ?>
    cela m'affiche
    et dans le cookies :
    Voilà la fonction de connexion actuelle :
    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
    function CreateP($Pseudo,$Pass)
    		{
    			$Pseudo = $this->connexion->real_escape_string($Pseudo);
     
    			$sql = "SELECT Prenom_P,Id_P,VIP FROM personne WHERE Prenom_P = '".$Pseudo."' AND Pass_P = '".md5($Pass)."'";
     
    			$req = $this->connexion->query($sql) or die('Erreur SQL !');
    			$res = mysqli_num_rows($req);
     
    			if($res == 0)
    			{
    				echo"<center><font color=\"red\">/!\ Aucun utilisateur n'a été trouvé. Vérifiez votre login/password. /!\</font></center>";
    				echo"<br/>";
    			}
    			if($res == 1)
    			{
    				while ($row=mysqli_fetch_row($req))
    				{		
    					$this->Prenom = $row[0];
    					$this->ID = $row[1];
    					$this->VIP = $row[2];
    				}
    				$_SESSION['login'] = $this->Prenom;
    				$_SESSION['id'] = $this->ID;
    				$_SESSION['vip'] = $this->VIP;
    				$this->Cookies = $this->ID."_".$this->Prenom."_".$this->VIP;
    				return $this->Cookies;
    			}
    		}
    Là c'est la fonction de base sans modification. J'ai essayé de rajouté du htmlentities(stripslashes()) sur le $row[0]; pour supprimer le / mais cela ne fait rien du tout.

    Si je fais cela directement sur la session Bienvenue ... ca m'enlève le double slashes devant mais il m'en reste un (celui présent dans la BDD).

    Comment fonctionne le cookies ? Est-ce un 'langage' spécifique pour qu'il mette %... dans le cookies ?

    Comment puis-je régler mon soucis ? Autant au niveau du cookies et pourquoi il me rajoute \\ sur l'accueil ? Un pour la quote et un pour le slashe qui est censer échappé ?

    J'ai tenté d'autres fonctions comme utf8_decode(),... rien

    Je n'arrive pas à trouver de réponse sur google (peut-être que je cherche aux mauvais mots clés ?).

    Merci d'avance !

    edit :
    J'avais oublié cette ligne qui permet de créer le cookie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setcookie('lesferias',$_GET['id'], time() + 365*25*3600, '/', null, false, true);
    $_GET['id'] est la chaîne créé dans la fonction ($this->Cookies)
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  2. #2
    Membre éclairé Avatar de EIN-LESER
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2008
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 703
    Points : 778
    Points
    778
    Par défaut
    Les cotes et doubles cottes ont tendance a etre casse tete dans ces cas la.

    En cas de bloquage je suis partisant de contraindre les user a la creation de leur pseudo.

    Tu n'autorise que les caractertes que tu veux et tu efface les caractertes non desiré deja dans la base (en envoyant un msg par exemple aux users concernés)

    Pour la contrainte tu peux le faire en javascript tres facilement (sorry pas le bon forum la mais comme on mélange presque toujours php et javascript dans les pages.)

    comme sa par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /*Fonction qui ne permettra que la saisie de chiffres et lettres dans un input*/
    function chiffreslettres(objInput){
       var reg = /^[0-9a-zA-Z]*$/;
    ici seuls les chiffres et lettres sont autorisé.

    Sur ton input du pseudo tu appel cette fonction avec onkeydown ou avec onchange.
    Spécialiste des questions bêtes

    ”If you can't explain it simply, you don't understand it” (Ce que tu ne peux pas expliquer simplement, tu ne le comprends pas) Albert Einstein

    Si une reponse vous plait ou vous a aidé n'hesitez pas a voter pour

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Je comprend, au début je voulais faire cela, lors de l'inscription vérifier que les quotes, doubles quotes, caractères du type <, > ... soit pas tolérés.

    Mais au final ca restreint pas mal l'utilisateur ... puis le soucis dans les cookies arriveront avec les spaces aussi car biensûr j'ai un membre qui a pris : Basqu'au Landais comme pseudo ... donc j'imagine pas la tête du cookies :s

    Ou alors je revoie ma conception et stocke pas le pseudo dans le cookie, pour éviter ce problème :s

    Mais j'aimerais comprendre pourquoi la création d'un cookie génère ces caractères ? Un peu comme les espaces %20 j'ai l'impression :s
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  4. #4
    Membre éclairé Avatar de EIN-LESER
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2008
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 703
    Points : 778
    Points
    778
    Par défaut
    Mais concrètement pourquoi ton cookie?
    Une variable de session ne ferait elle pas l'affaire?
    Spécialiste des questions bêtes

    ”If you can't explain it simply, you don't understand it” (Ce que tu ne peux pas expliquer simplement, tu ne le comprends pas) Albert Einstein

    Si une reponse vous plait ou vous a aidé n'hesitez pas a voter pour

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Si tu as des problème de quotes ', d'échappement de quotes \', alors faudrait voir du coté de Php, de la directive du php.ini : magic_quotes_gpc qui serait activée (à On).
    Si c'est le cas il faudrait la désactiver.

    Fait un phpinfo(), repère où elle se trouve pour connaitre sa valeur (post le au besoin).
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Oui mais si je supprime, tout mon site va foirer après non ? Vu que j'utilise stripslashes() partout sur le site (dès qu'il y a de l'info venant de la BDD) .. et que du coup dans la BDD toutes les quotes sont précédées de \
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  7. #7
    Membre éclairé Avatar de EIN-LESER
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2008
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 703
    Points : 778
    Points
    778
    Par défaut
    Quand tu a un problème avec un appel a une fonction sur plusieurs pages tu passe par l'outil de recherche de Notepad++ par exemple pour supprimer ou tout du moins repèrer tout les emplacement de cet appel.

    En ce qui concerne ta méthode je ne vois pas l’intérêt (ma faute peut être ^^)
    et je me pose des questions sur la sécurité.

    Si tu écris un cookie quand la personne se connecte sa veut dire que tu écris en claie dans un cookie sur le disque de l'user des informations dont le nom de tes variable d'identification des user.
    Je n'ai pas la science infuse mais cela me parait potentiellement dangereux.

    L'avantage de la session c'est que l'use'r ne voit rien des variables transmise ( ni contenus ni nom des variables).
    Spécialiste des questions bêtes

    ”If you can't explain it simply, you don't understand it” (Ce que tu ne peux pas expliquer simplement, tu ne le comprends pas) Albert Einstein

    Si une reponse vous plait ou vous a aidé n'hesitez pas a voter pour

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Oui mais la session existe seulement quand le navigateur est ouvert. Si l' user le ferme, alors il devra se relogguer.

    Moi personnellement, si je me connecte 10 fois sur le site dans la journée, je péte un boulon si je dois me reco 10 fois

    Je stocke le user et son id dans un cookie c'est vrai, c'est dangeureux si l'utilisateur se connecte dans un cyber ou autre. Mais là tant pis pour lui ...

    J'ai un bouton déconnexion qui détruit le cookies.

    Là j'ai mis la version courte du code. En fait toute la navigation du site se fait sur session, mais la sauvegarde sur cookies uniquement.

    Le principal c'est pas stocker le mot de passe en clair dans le cookie, après je pense que ca ira.. même si un mec à un pseudo dans le cookie, il pourra rien faire .. le changement de mot de passe se fait par mail et pas direct au cas où une session reste ouverte ...

    Bref, j'ai vu sur le net que les $_COOKIES encode et décode automatiquement ce qu'on lui envoie.

    En grois, le \' du pseudo est transformé en \\\' car il rajoute un \ devant chaque caractère.

    Il me suffit de passer un stripslashes() sur la récéption du cookie puis sur la session et ca fonctionne niquel
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  9. #9
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Vu que j'utilise stripslashes() partout sur le site (dès qu'il y a de l'info venant de la BDD)
    C'est ça l'erreur, il n'y a pas à supprimer les échappements venant de ta BDD.
    Si c'est le cas les données de ta Bdd serait polluée d'anti-slash de trop, les erreurs s’enchaine ...
    Ca va être un casse tête, car si c'est le cas, il faudra réparer avant de faire quoi que ce soit

    Il faut faire en sorte qu'il n'y ai pas d'échappement avant dans les données GET, POST, COOKIE, SESSION.
    Si cette directive magic_quotes_gpc est activé : (gpc comme GET POST COOKIE)
    1/ ça va échapper \'
    2/ tu applique un real_escape_sting(), soit un 2ème échappement : \\'
    3/ tu fais un stripslaches() : tu supprime 1 seul échappement \'
    Donc il en reste encore 1 : Problème !!!

    Mais tes données en GET, POST, COOKIE (échappée je rappel) ne sont pas toutes destinées à être enregistrées dans la Bdd, mais être manipulées, affichées directement, mis dans des fichiers, etc ...
    et elle sont toutes échappées.

    Bref ...
    Si magic_quotes_gpc est activé, c'est ingérable.
    De plus cela fait des années qu'il est dit qu'il faut la désactiver.
    Mais encore celle-ce sera supprimer un de ces jours.
    La création de cette directive fût une fausse bonne idée à l'époque.

    Donc si je résume :
    - Désactiver magic_quotes_gpc
    - Puis parcourir toutes les données de la Bdd et supprimer les échappements qu'il y aurait de trop pour avoir une base saine, propre (faut espérer qu'il n'y a pas de trop)
    - Voir s'il ce n'est pas le cas dans des fichiers aussi
    - Supprimer toutes les session par précaution pour peu qu'ils seraient échappés de trop
    - N'appliquer real_escape_string() QUE sur des données destinées à la Bdd.
    Il n'y a pas à faire de stripslaches(), sauf peut être rare cas particuliers.


    En somme, faut éviter de rajouter des problèmes là où il n'y en a pas.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  10. #10
    Membre éclairé Avatar de EIN-LESER
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2008
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 703
    Points : 778
    Points
    778
    Par défaut
    Je ne remets pas en cause la functionalité du code ou les raisons de son application.

    Citation Envoyé par bob633 Voir le message
    Je stocke le user et son id dans un cookie c'est vrai, c'est dangeureux si l'utilisateur se connecte dans un cyber ou autre. Mais là tant pis pour lui ...
    Cybercafé ou pas des personnes malveillantes sont pléthore et nul besoin de passer par un cybercafé.
    Certains cookies sont transmis par des virus sur les pc et il suffit que un user inscrit sur ton site voit le fonctionnement et ait envie de faire sa mauvaise action de la journée .....


    Le danger peut venir du fait que il est aisément possible de savoir comment tu a nommé et en partie utilisé tes variables de session a travers le cookie.

    Mais ceci n'est qu'une oignon strictement personnelle.
    Spécialiste des questions bêtes

    ”If you can't explain it simply, you don't understand it” (Ce que tu ne peux pas expliquer simplement, tu ne le comprends pas) Albert Einstein

    Si une reponse vous plait ou vous a aidé n'hesitez pas a voter pour

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Du coup en fait il faut passer real_escape_string() seulement quand les données vers la BDD ne passent ni par get ou post ? Mais dans ce cas précis, il va ajouter les \ devant les ' dans la BDD non ?

    La BDD actuelle est pas grosse, je peux facilement modifier les données.

    Je ne savais pas que GET et POST était déjà échapées.

    Du coup à l'affichage je dois faire quoi ? un htmlentities() sur la variable quand même ? Ca va garder automatiquement les sauts de lignes aussi ? si j'insére directement le POST dans la BDD ?

    Pour le cookies, tu proposes quoi sinon ? Car je comprend que les petits malins puissent s'amuser .. mais je pense qu'on est jamais protégé à 100% ...

    Peut-être ne pas stocker le nom du login, et seulement des ID propre à chaque membre .. de manière à pas pouvoir le modifier.
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  12. #12
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Du coup en fait il faut passer real_escape_string() seulement quand les données vers la BDD ne passent ni par get ou post ? Mais dans ce cas précis, il va ajouter les \ devant les ' dans la BDD non ?
    Oui et non, et c'est bien là le problème car d'une part il y a amalgame, mais surtout, la gestion des données devient plus compliquée, pour moi c'est même ingérable.

    Pour info, depuis que je fais du Php j'ai jamais activé cette directive car dès le départ j'avais vu que c'était le souk.


    J'ai dit oui ou non (quand cette directive est activé) :
    -> Oui dans le sens où GET POST et COOKIE sont donc déjà échappés, il n'y a pas à (re)échapper (pour la Bdd).

    -> Non dans le sens ou cette directive n'échappe pas toutes les données (tous les caractères), donc persistes des bug potentiels à cause de ça.
    C'est pour cela qu'il est dit qu'il vaut mieux utiliser la fonction d'échappement dédiée propre à la Bdd.
    Pour MySQL c'est : mysql_real_escape_string()


    Du coup on fait comment ?
    Il y a bien un choix à faire.

    Vu que la logique veux qu'on utilise mysql_real_escape_string(), l'échappement effectué par cette directive fait doublon, elle sème la zizanie.
    Il n'y a alors aucun intérêt à l'activé.


    En résumer, c'est nettement plus simple quand cette directive est désactivé.
    - Pour la Bdd on sécurise ces données avec la fonction dédiée, quelque soit l'origine des données (à part peut être rare cas très particuliers).
    -> mysql_real_string(), ou requête préparée (PDO)

    Et c'est tout.
    (faudra supprimer les stripslashes() de trop).

    Vois du coté de ton hébergeur, théoriquement il devrait te donner le moyen de désactiver ça.
    Sinon, ça peu se faire via le .htaccess, ou ini_set().


    Pour le reste, je dirais qu'il faudrait éviter de courir après plusieurs lièvres à la fois, ça rend les choses confuses.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  13. #13
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Merci pour ces explications. De mon côté j'ai regardé sur le net pour avoir un cours là dessus car je ne fais pas souvent du PHP et donc je ne connais pas toute la chaîne de sécurité.

    Ce que je trouve étonnant c'est que la comportement est différent entre le local et en ligne (hébergeur OVH).

    Avec le magic_quote_gpc activé, voici ce que ca me fait en local (en regardant direct dans la BDD) :
    Ce que ca me fait en ligne :
    J'ai seulement pu testé en local de désactiver le magic_quote_gpc et j'obtiens le même résultat dans la BDD :
    Je testerais ce soir sur mon hébergeur mais j'ai du mal à saisir pourquoi il m'affiche ces caractères affreux alors que je fais seulement mysql_real_escape_string() avant l'insertion en BDD comme en local.

    Fiou décidément ca reste un casse tête pour moi même si dans l'idée je comprend que ma méthode n'est pas correcte.

    Pourquoi mon hébergeur afficherait aussi ces caractères ? Du coup en passant un htmlentities(stripslashes($variable), 'UTF-8')) ca me réaffiche les bons caractères.

    Règle N° 1 : Si tout va bien, ne touchez à rien.

  14. #14
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je ne sais pas comment tu fais tes essai, de même le fait de ne pas voir ce qu'il y a dans ta Bdd fait que ???

    Te prends pas la tête, c'est plus simple que ça en a l'air.
    ->Il te faut une Bdd propre, sans anti-slash superflu rajoutés de trop du fait que cette directive était activé.
    Faut éviter le piège.
    -> Il te faut désactiver cette directive, cela ne sert à rien de poursuivre sans ça (local et distant).
    -> Ensuite, il faut juste conserver les mysql_real_escape_string() quand il s'agit des données de la Bdd.
    -> S'il y a des stripslashes() qui trainent il faut les supprimer, il ne servent plus à rien (on a plus de données échappées), à part peut être rare cas particuliers.


    Pour ce qui est des caractère bizarre, tu pourrais utiliser htmlspecialchars() à la place de htmlentities().

    Essaie déjà comme ça.

    Avec le magic_quote_gpc activé, voici ce que ca me fait en local (en regardant direct dans la BDD) :
    Pour ma part, tu perds ton temps à le comprendre.
    Plus grand monde aujourd'hui active cette directive, je te l'ai dis, elle sera supprimée un jour.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  15. #15
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Je vais faire comme ca et testé alors !

    C'est juste que je suis au taf et je n'ai pas accès à ma BDD en ligne, donc j'ai testé seulement en local pour le moment.

    Pour mes essais j'ai pris ma page 'news' du site, qui requiert un titre, un corps et un lien vers l'image, le tout envoyés en POST tel quel (pas d'action ou transformation dessus). Ensuite dans ma fonction, je récupère ces POST en paramètre, je fait un mysql_real_escape_string() sur les variables juste avant l'insertion.

    En fait, je pense pas être loin du but au final car pour le moment c'est OK ?

    En fait j'aimerais juste savoir à quel moment ce magic_quote_gpc influe-il. J'ai bien compris que ce sont des quotes magiques pour l'échappement mais si on le désactive, je vois pas trop en quoi ca influe .. les post, get et cookies sont plus échappées ?

    Pour les caractères bizarres, c'est ce que je vois dans la BDD directement.

    J'ai pris une capture d'écran de la base en local :
    - Les deux premières lignes sont des lignes de la base en ligne (que j'ai importé)
    - La 3eme un essai direct en local
    - La 4eme un essai direct en local en désactivant le magic_quote_gpc

    Désolé si j'insiste peut-être un peu trop, mais autant partir sur des idées claires =)
    Images attachées Images attachées  
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  16. #16
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Pour les caractères bizarres, c'est ce que je vois dans la BDD directement.
    Arff, décidément, tu alignes les problèmes.
    T'as un un problème d'encodage.

    Et bien là c'est en partie la même chose : Comme le mal est déjà fait, il va falloir repartir sur une Bdd saine quitte à corriger ça manuellement via PhpMyAdmin.
    (du moins, si tu en a peu c'est plus simple).

    Fais le point la dessus : Comment utiliser de l'UTF-8 avec PHP / MySQL ?
    Il doit te manquer une étape.
    J'ai idée que ce serait du coté de MySQL : mysql_set_charset('utf8')


    mais si on le désactive, je vois pas trop en quoi ca influe .. les post, get et cookies sont plus échappées ?
    Oui, et c'est très bien comme ça.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  17. #17
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    En effet, j'ai tout mes metta en UTF-8 dans mes pages HTML, encodés UTF-8 sans bom sous np++

    Mais j'ai pas la ligne mysql_set_charset('utf8') après la connexion à la BDD dans mes classes PHP. C'est pour cela que je dois avoir une différence entre le local et sur OVH (version ou autre).

    Je teste ca ce soir et je reviens vers ce poste pour dire ce qu'il en est.

    Encore merci pour toutes ces infos, je vais tester

    edit : En fait je viens de regarder et j'ai bien mis cette ligne après ma connexion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $connexion = new mysqli('localhost', 'user', 'mdp');
    $connexion->select_db('nom_bdd') or die("erreur");
    $connexion->set_charset("utf8");
    Toutes mes pages HTML commencent comme ceci :
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

    Règle N° 1 : Si tout va bien, ne touchez à rien.

  18. #18
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $connexion = new mysqli('localhost', 'user', 'mdp');
    $connexion->select_db('nom_bdd') or die("erreur");
    $connexion->set_charset("utf8");
    Je n'avais pas fais attention que tu utilisais MySQLi.
    Vraiment désolé.


    Par conséquent il faut oublier le fait d'utiliser la fonction mysql_real_escape_string().
    Il te faut utiliser les requêtes préparées, il n'y aura alors plus besoin d'échapper quoi que ce soit, MySQLi s'occupe de tout (sécurisation des donnée).
    C'est comme pour PDO.

    Par ailleurs, j'utilise essentiellement PDO, j'ai jamais essayé MySQLi.
    La suite sera quelque peu sous réserve.
    Si je regarde ton code de ton 1er post, je remarque ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $res = mysqli_num_rows($req);
    while ($row=mysqli_fetch_row($req))
    Cela me surprends un peu.
    Au départ tu affectes une instance MySQLi à $connexion, puis par la suite tu utilises les fonctions mysqli_num_rows() et mysqli_fetch_row().

    Si je regarde la doc : http://fr2.php.net/manual/fr/function.mysqli-fetch.php
    D'une part ces fonctions seraient obsolètes : Fonctions mysqli obsolètes et alias
    Citation Envoyé par Doc Php
    Note:

    mysqli_fetch() est fortement déconseillée et devrait être supprimée prochainement.
    Il ne faudrait pas utiliser les fonctions, mais l'Objet MySQLi.

    Mais au départ tu utilises MySQLi Objet, mais tu mélangerais les 2, Objet et fonctions.
    Je me dis (pure hypothèse) que lorsque que tu utilises les fonctions la connexion ne serait plus la même, une autre différentes serait affectée automatiquement.
    L'encodage ne serait plus de l'UTF-8, mais du Latin par défaut.


    A mon sens faudrait faire toutes tes requêtes avec le même objet (ou instance) MySQLi, c'est à dire $connexion.
    (Pour exemple) A savoir que lorsqu'on effectue une préparée, cela renvoie un Objet MySQLi_Statement, c'est à dire un gestionnaire de requête.
    Ensuite, pour parcourir les résultat, il faut le faire avec l'Objet Statement :
    while ($stmt->fetch()) { ... etc ... }

    Regarde les exemple dans la doc :
    mysqli::prepare
    mysqli_stmt::fetch
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  19. #19
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Re,

    Bon je viens d'ajouter dans le .htaccess ce qui permettait de désactiver le magic_quote et j'ai toujours un soucis d'anti slashes ajouté et de caractères bizzare (même si je sais que ca vient d'ailleurs).

    Le résultat du phpinfo() est en pièce jointe.

    Je test actuellement sur l'ajout des news. Voilà le bout de 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
    <?php
    		if((!empty($_POST['titre']))&&(!empty($_POST['corps']))&&(!empty($_POST['img'])))
    		{
    			include("../connexion/connexionBDD2.php");
    			$date = date('Y-m-d');
    			$heure = date('H:i:s');
    			$titre = $connexion->real_escape_string($_POST['titre']);
    			echo $_POST['corps']; // Affiche bien le POST sans les \
    			echo"<br/><br/>";
    			$corps = $connexion->real_escape_string($_POST['corps']);
    			echo $corps; // Affiche les \
    			echo"<br/><br/>";
    			$img = $connexion->real_escape_string($_POST['img']);
    			$addNews = "INSERT INTO news(Titre_news,Corps_news,img_news,Date_news,Heure_news) 
    							VALUES ('".$titre."','".$corps."','".$img."','".$date."','".$heure."')";
    			echo $addNews; \\ Affiche la requête avec les \ et els bons caractères. C'est bien l'insertion coter BDD où il y a un soucis 
    			$connexion->query($addNews) or die ("Erreur creation news");
    		}
    	?>
    Fichier connexionBDD2.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    	$connexion = new mysqli('localhost', 'root', '');
    	$connexion->select_db('nom_bdd') or die("erreur");
    	$connexion->set_charset("utf8");
    ?>
    Sur la page où se trouve le code ci-dessus, j'ai bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
    La page est encodée en UTF-8 (Sans BOM).

    Je vois vraiment pas

    J'ai modifié l'interclassement de ma table news en ut8_unicode_ci mais rien. Je désespère

    edit : Bon on a poster presque en même temps, je vois ce que tu veux dire. Je vais voir ca .. et modifier tout du coup :/
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  20. #20
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    edit : Bon on a poster presque en même temps, je vois ce que tu veux dire. Je vais voir ca .. et modifier tout du coup :/
    Tu as trop de problèmes, trop de facteurs qui entrent en jeux, c'est des coups à attraper mal au crâne, nous même on risque de ne plus rien comprendre.

    Mets de coté tout tes codes, ta Bdd, il n'y a pas besoin de ça pour le moment.

    Résout d'abord ce problème de magic_quote, c'est le BABA, de manière basique.
    (faut revenir à des choses plus simples).

    Crée un nouveau fichier à la racine, et mets ce code : (genre verifs.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    ini_set('default_charset', 'UTF-8');
    header('Content-Type: text/html; charset=UTF-8');
     
    // Fichier : verifs.php
    echo 'magic_quotes_gpc : '.ini_get('magic_quotes_gpc').'<br />';
    ?>
    Quelle est la valeur de cette directive ?
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 33
    Dernier message: 16/06/2006, 23h08
  2. [Cookies] Cookies et sessions
    Par TNorth dans le forum Langage
    Réponses: 6
    Dernier message: 19/05/2006, 00h22
  3. Réponses: 3
    Dernier message: 01/05/2006, 14h09
  4. [Cookies] PB sessions php et navigation sous imode
    Par hardkmel dans le forum Langage
    Réponses: 8
    Dernier message: 23/12/2005, 12h22
  5. [Cookies] Récupération de cookie de session...
    Par Tizard dans le forum Langage
    Réponses: 1
    Dernier message: 07/12/2005, 14h33

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