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 :

[Mail] texte acceptant les caractères spéciaux pour traitement [Fait]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut [Mail] texte acceptant les caractères spéciaux pour traitement
    Bonjour,

    C'est mon premier post ici! Désolé pour le titre plus ou moins représentatif... je ne savais pas trop comment formuler mes idées.

    Voilà, je connais bien le HTML, et là je suis en train d'apprendre le PHP. Le chapitre que je lis actuellement montre comment faire une application toute simple pour envoyer des courriels, à l'aide d'un simple formulaire et de la fonction mail() de PHP.

    Mon problème est le suivant, j'aimerais pouvoir entrer des caractères tels que ", ', \ dans la zone de texte de mon formulaire sans utiliser les entités HTML (" par exemple). Jusqu'à maintenant, si j'entre ces caractères dans la zone de texte, la méthode post met automatiquement des \ (backslash) devant.

    Code formulaire HTML:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" name="message" />

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $to = <a href="mailto:adresse@domaine.com">adresse@domaine.com</a>;
    $subject = "Un sujet quelconque";
    $message = $_POST["message"];
    $headers = "From: <a href="mailto:autre_adresse@domaine.com">autre_adresse@domaine.com</a>\r\n";
    $mailsent = mail($to, $subject, $message, $headers);


    Problème:

    Supposons que mes utilisateurs, qui ne connaissent rien au HTML, et donc ne connaissent pas les entités HTML, veuillent envoyer le message suivant avec mon application:

    J'ai un message à envoyer...

    Ils entrent ce message dans le champ "message" de mon formulaire, et c'est alors que le message à envoyer se transforme malheureusement en:

    J\'ai un message à envoyer...


    Veuillez m'aider SVP, car je ne vois vraiment pas quoi faire pour y remédier.

    Merci

  2. #2
    Membre éprouvé
    Avatar de viviboss
    Profil pro
    Inscrit en
    Août 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Août 2006
    Messages : 943
    Points : 1 248
    Points
    1 248
    Par défaut
    Le problème est qu'en utilisant la fonction mail() tout simplement, tu utilise par défaut l'envoi de mail au format "texte", qui est relativement limité en terme caractères spéciaux..... De toute les facons, les caractères sépciaux (/,",') doivent être échappés, sinon ils risquent d'être interprété par PHP comme une instruction de code....

    Il vaudrait mieux que tu utilise ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mail($destinataire,'email html',$html,"Content-Type: text/html \n");
    Comme ca, tu envoie ton mail au format HTML directement, et tu peux utiliser le fameux htmlentities.....
    Veni Vidi Vici
    -------------------------
    Mes articles : developpez.com ou bien vbview.net
    -------------------------
    Et SURTOUT ne pas oublier la bible PHP : --> php_manual_fr.chm!!!
    Et aussi : --> pear_manual_fr.chm!!!

    Ou encore : --> Les tutoriaux & cours PHP de Développez.com
    -------------------------

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    J'utilise déjà l'instruction "Content-Type: text/html".

    Mais, de toute façon, ceci est différent de mon problème. J'aimerais pouvoir utiliser les caractères ", ', et \ dans la zone de texte SANS avoir à utiliser le format &entité; de HTML.

    Par exemple, si un utilisateur tape "J'ai faim" dans une boìte de formulaire de type texte, j'aimerais que la valeur de $_POST['texte'] soit "J'ai faim", et non "J\'ai faim".

    C'est comme si le formulaire rajoutait automatiquement les \ avant ", ', ou \.

    Autre exemple:

    je veux entrer dans une zone de texte (input type="text") Mon alias est "alias", mais le résultat renvoyé par $_POST['texte'] est Mon alias est \"alias\"

  4. #4
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Points : 3 264
    Points
    3 264
    Par défaut
    Salut et bienvenue sur les forums de developpez.com,

    Je ne comprends pas pourquoi tu as des slashs en plus si tu ne les rajoutes pas explictement.
    N'as tu pas un addslashes() qui traine quelque part dans ton code PHP?

    Bien sur, je ne connais pas ton but final, mais ca m'étonne de voir un formulaire de mail ou le corps du message est renseigné dans un input type=text. On a plus l'habitude de le mettre dans un textarea.

    Es-tu sur de ne pas avoir un traitement javascript à la soumission de ton formulaire ou alors un traitement PHP qui modifie la variable $_POST avant que tu n'envoies ton mail?
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Je n'ai absolument rien en javascript. Je ne comprends vraiment pas moi non plus. Tu as raison pour le textarea au lieu de text, mais malheureusement, ça produit exactement le même problème.

    J'ai même fait un test en réduisant à leur plus simple expression mes fichiers, pour être certain qu'il n'y avait pas quelque chose qui m'échappait.

    Voici mon test:

    Premier fichier: test.html
    Contenu:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <html>
    	<form action="process_test.php" method="post">
    		<input type="textarea" name="zone" />
    		<input type="submit" value="Soumettre" />
    	</form>
    </html>

    Deuxième fichier: process_test.php
    Contenu:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    echo $_POST['zone'];
    ?>


    Ce qui se passe:

    Je "load" test.html dans mon navigateur (Mozilla Firefox), je tape Je m'appelle "Philippe" dans la zone de texte et j'appuie sur "Soumettre".

    La page suivante serait supposée afficher la même chose que ce que j'ai entré dans la zone de texte, mais à la place je vois Je m\'appelle \"Philippe\".

    Les backslash (\) ont été rajoutés. C'est peut-être quelque chose dans ma configuration PHP. J'aimerais bien que quelqu'un m'éclaire.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    En passant, qu'est-ce que le addslashes(), peut-être qu'il y a un truc du genre dans ma configuration. J'utilise XAMPP qui est déjà tout configuré pour rouler PHP et mySQL.

  7. #7
    Membre éprouvé
    Avatar de viviboss
    Profil pro
    Inscrit en
    Août 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Août 2006
    Messages : 943
    Points : 1 248
    Points
    1 248
    Par défaut
    Tu as l'échappement automatique activé du à l'instruction MagicquoteGPC qui est à "on" dans ton PHP.ini.

    Tu peux le désactivé (c'est même plutot recommandé) avec un pitit ini_set() et le nom du paramètre à changer.....Pour cela, va voir ton PHP.ini à la ligne magicquote.

    Le magicquote est activé par défaut : à chaque caractère de quote (',") il ajoute un antislashe, ce qui permet, théoriquement, d'éviter les injection SQL
    Veni Vidi Vici
    -------------------------
    Mes articles : developpez.com ou bien vbview.net
    -------------------------
    Et SURTOUT ne pas oublier la bible PHP : --> php_manual_fr.chm!!!
    Et aussi : --> pear_manual_fr.chm!!!

    Ou encore : --> Les tutoriaux & cours PHP de Développez.com
    -------------------------

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Ça fonctionne!

    J'ai mis magic_quote_gpc = Off et maintenant, tout fonctionne comme désiré.

    Merci beaucoup viviboss!

    Ah, oui, et si jamais tu repasses, pourrais-tu me parler un peu des injections SQL, je n'ai aucune idée de ce que ça signifie.

    Merci encore.

  9. #9
    Membre éprouvé
    Avatar de viviboss
    Profil pro
    Inscrit en
    Août 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Août 2006
    Messages : 943
    Points : 1 248
    Points
    1 248
    Par défaut
    De rien !!!!

    Les injections SQL sont clairement du "piratage". Ca vient de gens malintentionnés, comme on dit !!!!

    Une requête mysql est composé d'une instruction en SQL, enfermé dans des guillemets.

    Il est alors facile pour quelqu'un, lorsqu'il voit un champs texte par exemple, et si il sait que derrière il y une base de données, de faire des "injection", c'est à dire mettre dans le champs texte une requete SQL supplémentaire !!!!

    exemple : Voici un script qui récupère la phrase entré dans un champs texte, et l'insert dans une BDD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $texte=$_POST['champs_texte'];
     
    $query="INSERT table VALUES(texte='".$texte."')";
    Cette requête semble parfaitement correct, et son insert aussi.

    Maintenant, quelqu'un entre une phrase avec des caractères spéciaux (',"...) et le PHP.ini a le magicquote à "ON" : la phrase est, par exemple : j'ai dit : "j'ai fain !!!"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /*$texte recoit le champs texte.
    $texte recoit, grace à magicquote, la phrase suivante :
    j\'ai dit : \"j\'ai fain !!!! \"*/
    
    $texte=$_POST['champs_texte'];
    
    
    /*La requête recoit alors :
    "INSERT table VALUES (texte='j\'ai dit : \"j\'ai fain !!!!\"')";*/
    $query="INSERT table VALUES(texte='".$texte."')";
    Là, tout ce passe bien. Magicquote a inséré tout seul ses caractères d'échappement, ce qui fait que les quotes ne sont pas interprétés. Magicquote marche dans les deux sens : il intègre automatiquement les échappements, et les retires aussi automatiquement quand on affiche des résultats de requête par exemple (SELECT.....)

    Maintenant, retiron magicquote du php.ini, et "oublions" de mettre le addslashes() devant la variable $texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /*$texte recoit le champs texte.
    $texte recoit, sans magicquote, la phrase suivante :
    j'ai dit : "j'ai fain !!!! "*/
    
    $texte=$_POST['champs_texte'];
    
    
    /*La requête recoit alors :
    "INSERT table VALUES (texte='j'ai dit : "j'ai fain !!!"')";*/
    $query="INSERT table VALUES(texte='".$texte."')";
    ...Et là, c'est le drame. Pourquoi ? Regarde mieux la requête : le quote de texte=' est fermé par le premier quote rencontré, et pire : la requête est fermé au premier double quote rencontré !!! ( le dit : " )

    Alors, imagine les possibilités maintenant : si à la place de j'ai dit : "j'ai fain !!!" je met : 0') AND DROP DATABASE(bdd)"; (la requête n'est pas juste, mais c'est pour illustrer.....), et bha là, t'as plus de base de données !!!!! Et crois moi, c'est pas qu'aux autres que ca arrive.

    Alors le magicquote est une option pratique quand on ne fait pas attention. Les recommandations sont quand même de les mettre à "OFF", mais à ce moment là (et de toute les facons c'est une habitude à prendre pour TOUT ce qui vient de l'extérieur....) il faut faire des contrôle sévères et stricts sur les infos que peuvent saisir les utilisateurs !!!!

    Un moyen parmis tant d'autres de commencer à sécuriser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $texte= trim(htmlentities($_POST['champs_texte']));
     
    $query="INSERT table VALUES(texte='".$texte."')";
    A cela, on hésitera pas à banir des balises (comme <script>....), à mettres expressions régulières, etc.

    Pour les formulaires surtout. Car beaucoup de spammeur passent par les formulaires non sécurisé pour utiliser les sendmail des serveur.....

    Bref, il y a beaucoup à dire sur la sécurité !!!!!

    Ici il y a des trucs intéressant :
    http://php.developpez.com/cours/#securite

    Bonne Chance !!!!
    Veni Vidi Vici
    -------------------------
    Mes articles : developpez.com ou bien vbview.net
    -------------------------
    Et SURTOUT ne pas oublier la bible PHP : --> php_manual_fr.chm!!!
    Et aussi : --> pear_manual_fr.chm!!!

    Ou encore : --> Les tutoriaux & cours PHP de Développez.com
    -------------------------

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

Discussions similaires

  1. encodder tous les caractères spéciaux pour un URL
    Par SuperPat dans le forum Général Java
    Réponses: 2
    Dernier message: 30/01/2009, 10h39
  2. Réponses: 5
    Dernier message: 16/01/2009, 16h33
  3. Réponses: 0
    Dernier message: 28/12/2008, 22h44
  4. [XSLT] Supprimer les caractères spéciaux HTML d'un noeud texte
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/12/2008, 22h59
  5. Script shell pour enlever les caractères spéciaux d'un nom de fichier
    Par babo dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 12/09/2008, 13h49

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