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

HTML Discussion :

Envoi du caractère % en POST


Sujet :

HTML

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Envoi du caractère % en POST
    Bonjour à tous,

    J'ai une erreur 406 sur mon site chaque fois que le caractère % (pourcentage) est inscrit dans un champ de mon formulaire et que j'envoie en POST sur un fichier PHP.

    Mon hébergeur dit que le % en utf-8 est %25 et que je dois me servir de la fonction str_replace() de PHP. Mon problème est que j'ai l'erreur 406 avant même d'accéder à la page PHP. J'ai créé le fichier test.html pour un formulaire et un fichier test1.php pour tester au plus simple et j'ai toujours la même erreur.

    Le code de test.html :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Ma page de test</title>
      </head>
      <body>
        <form action = "test1.php" method="post">
          Votre nom : <input type = "text" name = "nom"><br />
          <input type = "submit" value = "Envoyer">
        </form>
      </body>
    </html>
    Le code du fichier test1.php :
    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
     
    <?php
    ?>
    <html>
      <head>
        <title>Ma page de traitement</title>
      </head>
      <body>
    <?php
    // on teste la déclaration de nos variables
    if (isset($_POST['nom'])) {
            // on affiche nos résultats
            echo 'Votre nom est '.$_POST['nom'];
    }
    ?>
      </body>
    </html>
    J'ai même essayé avec un var_dump($_POST['nom']) et l'erreur 406 arrive avant. Alors, comment gérer le str_replace() ou toute autre solution, elle sera la bienvenue?

    Merci.

    Dany

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Il faut préciser l'attribut enctype du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action = "test1.php" method="post" enctype="application/x-www-form-urlencoded">
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse, mais cela ne change rien, j'ai toujours l'erreur 406 si je mets un % dans le champ.

    Dany

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Es-tu sûr qu'il s'agit du caractère % ? Tu l'as essayé seul ? Dans une chaine ? As-tu essayé avec un autre caractère spécial ?
    Avec ton code je ne vois aucun problème de mon côté.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Merci de vous intéresser à mon problème.

    Comme mon hébergeur m'a dit, %25 passe, mais je ne peux demander au client d'écrire %25 lorsqu'il parle de 100 % dans son message.

    J'ai essayé !"/$?&*()_+'éè#|\ et cela passe correctement, mais lorsqu'il y a le caractère % seul ou dans une phrase l'erreur 406 apparait.

    Je ne comprends rien.

    Ma première idée, c'est que cela venait des configurations d'apache, dont je n'ai aucun accès, car à mon avis cela se produit avant d'accéder à la page en PHP. Quand pensez-vous?

    Dany

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Août 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 19
    Points : 115
    Points
    115
    Par défaut
    Bon, déjà ton hébergeur est une grosse quiche !
    un conseil change en rapidement !

    un % en UTF-8 ne se code pas %25, mais bien %
    c'est exactement le même codage en ascii qu'en UTF-8 (je parle dans le cas du % bien sur)

    le problème vient de ton browser qui n'encode pas ce caractère en format "url-encoding"
    C'est un codage spécifique pour encoder les urls (et le contenu des variables transmises avec l'url)

    T'as essayé avec un autre browser ?

    sinon essayes de passer l'action du formulaire en GET.
    Tu va recupéré les variables dans ton url
    après, donnes nous l'url complète (surtout les variables passées)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Pour la grosse quiche, je suis d'accord.

    J'étais avec Firefox pour mes tests et comme vous me l'avez mentionné j'ai essayé avec ie8 et Google Chrome et j'ai le même résultat.

    J'ai ensuite passé l'action du formulaire en GET et voici l'URL :
    http://monsite.com/test1.php?nom=test+%25

    Dany

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Août 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 19
    Points : 115
    Points
    115
    Par défaut
    et ça fonctionne en GET ou pas ? t'as une erreur 406 ?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    J'ai toujours l'erreur 406 même en GET.

    Dany

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Août 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 19
    Points : 115
    Points
    115
    Par défaut
    Ton hébergeur est vraiment une GROSSE quiche

    Apparemment ca viendrait de la configuration du module modSecurity d'apache qui considère ton % comme une tentative de piratage

    essayes de changer le nom de ton input
    mais un nom à la con du genre dR56_vg, pour voir si ça passe

    sinon demande des détails sur la config de modSecurity à ton hébergeur
    On va voir sa tête (si ca se trouve il sait meme pas ce que c'est que ce truc)

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    J'ai essayé en changent le nom dans input pour dR56_vg avec GET, voici les résultats :

    input = dr56_vg

    Votre nom : test %
    http://monsite.com/test1.php?dr56_vg=test+%25 donne erreur 406

    Votre nom : test
    http://monsite.com/test1.php?dr56_vg=test donne var_dump($_GET['dR56_vg']); = NULL

    Votre nom : test %25
    http://monsite.com/test1.php?dr56_vg=test+%2525 donne var_dump($_GET['dR56_vg']); = string(8) "test %25"
    input = nom

    Votre nom : test %
    http://monsite.com/test1.php?nom=test+%25 donne erreur 406

    Votre nom : test
    http://monsite.com/test1.php?nom=test donne var_dump($_GET['nom']); = string(4) "test"

    Votre nom : test %25
    http://monsite.com/test1.php?nom=test+%2525 donne var_dump($_GET['nom']); = string(8) "test %25"
    Très bizarre lorsque le nom de l'input n'est pas "nom" et que je rentre comme nom "test" que cela donne NULL!

    Pour ma grosse quiche, je crois que c'est un employé, je vais essayer de communiquer avec son supérieur demain, mais qu'est-ce que je lui dis au juste?

    Dany

  12. #12
    Membre régulier

    Profil pro
    Inscrit en
    Août 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 19
    Points : 115
    Points
    115
    Par défaut
    ca vient ben de modSecurity

    pour t'en convaincre essayes autre chose que %25 par exemple "test%test"
    ca devrais marcher je pense

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    J'ai essayé le % suivie de presque tous les chiffres jusqu'à 99 et certaines lettres comme %da qui est d'après moi du hexadécimal et ça passe.

    Mais avec test%test j'ai l'erreur 406. Pour moi juste un code hexadécimal après le % passe, rien d'autre.

    Dany

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    J'ai finalement reçu une réponse de mon hébergeur, sa solution passe par du JavaScript que je trouve assez complexe à implémenter dans tous mes formulaires, qui en plus ne font que changer le % en %25 lors de l'envoi. Il faudrait en plus que je replace le %25 en % lors de l'insertion en base de données ou à la lecture.

    J'aimerai savoir ce que vous en pensez? Voici son exemple :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    <? 
    if ((isset($_POST['soumettre'])) && ($_POST['soumettre'] == '1')){
    ###
    # vérification anti-spam
    ###
    if (!empty($_POST['sp'])){break;}
    #
    #
    # le formulaire doit avoir été soumis depuis le bon formulaire et non pas directement
    $de = $_SERVER['HTTP_REFERER'];
    if (($de != 'http://www.monsite.com/form2.php') && ($de != 'http://www.hebergeur.com/1/form2.php')) {break;}
    ###
    # fin vérification anti-spam
    ###
     
     
    $nomde= $_POST['nomde'];
    $emailde=$_POST['emailde'];
    $sujet=$_POST['sujet'];
    $mess=$_POST['mess'];
     
     
    # exemples de caractère malicieux qu on peut chercher et remplacer pour nettoyer le contenu des variables
    $htm = array("&amp;", "&quot;", "'", "&lt;", "&gt;", ";", ":", "'");
    $htm2 = array("&", "\"", "'", "<", ">");
    $htm3 = array("<", ">");
    $htm4 = array("\"", "'", "<", ">", ":");
    $htm5 = array("&amp;", "&quot;", "'", "&lt;", "&gt;", "'");
    $htm6 = array("www.site-1.com", "www.site-2.com", "www.site-3.com");
    $htm6 = array("|-|");
    // nétoie le code Nom de l expéditeur et remplace des caractères
    $nomde = str_replace($htm6, "%25", $nomde);
    $emailde = str_replace($htm6, "%25", $emailde);
    $sujet = str_replace($htm6, "%25", $sujet);
    $mess = str_replace($htm6, "%25", $mess);
     
     
    echo 'Nom : '.$nomde.'<br>' ;
    echo 'email : '.$emailde.'<br>' ;
    echo 'Sujet : '.$sujet.'<br>' ;
    echo 'Message : '.$mess.'<br>' ;
     
    echo '<p><a href="form2.php">Nouvel essai ici</a></p>';
    }
    else {
    ?>
    <html>
    <head>
    <title>Untitled Document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     
    <SCRIPT LANGUAGE="JavaScript">
    <!-- Début
    function stringFiltre1 (input) {
    s = input.value;
    returnString=s.replace('%','|-|');
    input.value = returnString;
    }
    function stringFiltre2 (input) {
    s = input.value;
    returnString=s.replace('%','|-|');
    input.value = returnString;
    }
    function stringFiltre3 (input) {
    s = input.value;
    returnString=s.replace('%','|-|');
    input.value = returnString;
    }
    function stringFiltre4 (input) {
    s = input.value;
    returnString=s.replace('%','|-|');
    input.value = returnString;
    }
    //  Fin -->
    </script>
     
    </head>
     
    <body>
    <table width="500" border="0" cellpadding="0" cellspacing="0" id="nom">
      <tr>
        <td width="20">&nbsp;</td>
        <td width="460" align="center" valign="top"><table width="100%" border="0" align="center" cellspacing="0">
            <tr>
              <td ><form action="form2.php" method="post" name="form" id="form" onSubmit="">
    <?php 
    ##################################
    # début champs anti-spam 
    # Les robots ne comprennent pas qu il ne faut rien mettre dans ce champs 
    # et les humains ne le voient pas car il est hidden
    ###############################
    ?>
     <span style="display:none;visibility:hidden;">
    <label for="sp">Ne rien entrer dans ce champs, sinon votre message ne sera pas traité</label>
    <input type="text" name="sp" id="sp" value="" />
    </span>
    <?php 
    ##################################
    # fin champs anti-spam ; 
    ###############################
    ?>					   
                   <input name="soumettre" type="hidden" value="1">
    			  <div align="center"><font color="#000000" size="2" face="Arial, Helvetica, sans-serif">
                  </font> <font color="#000000" size="2" face="Arial, Helvetica, sans-serif"> </font></div>
                  <table width="100%">
                    <tr>
                      <td width="135" height="30"><div align="left"><font color="#000000" size="2" face="Arial, Helvetica, sans-serif">* </font><font class="texte_haut_gris_form">Nom
                          complet :</font></div></td>
                      <td align="left"><input name="nomde" type="text" id="nomde" size="30" class="texte_haut_gris_1">
     
                      </td>
                    </tr>
                    <tr>
                      <td height="30"><div align="left"><font color="#000000" size="2" face="Arial, Helvetica, sans-serif">* </font><font class="texte_haut_gris_form">Courriel
                          :</font></div></td>
                      <td align="left"><input name="emailde" type="text" id="emailde" size="30" class="texte_haut_gris_1">
                      </td>
                    </tr>
                    <tr>
                      <td height="30"><div align="left"><font color="#000000" size="2" face="Arial, Helvetica, sans-serif">* </font><font class="texte_haut_gris_form">Sujet
                          du message :</font></div></td>
                      <td align="left"><input name="sujet" type="text" id="sujet" value="Sujet" size="30" class="texte_haut_gris_1">
    </td>
                    </tr>
                    <tr>
                      <td height="34" valign="top"><div align="left"><font color="#000000" size="2" face="Arial, Helvetica, sans-serif">* </font><font class="texte_haut_gris_form">Question :</font></div></td>
                      <td align="left"><textarea name="mess" cols="25" rows="3" id="mess" class="texte_haut_gris_1"></textarea>
                      </td>
                    </tr>
                    <tr>
                      <td height="34"><div align="right"><font size="1" color="#000000" face="Arial, Helvetica, sans-serif">*champs obligatoirs&nbsp;&nbsp;</font></div></td>
                      <td><div align="left"><input type="submit" name="Submit" value="Envoyer" class="texte_haut_gris_1" onClick="stringFiltre1(nomde);stringFiltre2(emailde);stringFiltre3(sujet);stringFiltre4(mess);">
    				  &nbsp;&nbsp;
                          <input name="reset" type="reset" id="reset" value="Recommencer" class="texte_haut_gris_1"></div></td>
                    </tr>
                  </table>
                </form>
              </td>
            </tr>
          </table>
        </td>
        <td width="20">&nbsp;</td>
      </tr>
    </table>
    <p><a href="form2.php">Nouvel essai ici</a></p>
    </body>
    </html>
    <?php } ?>
    Tout ça pour seulement le caractère % qui ne passe pas, décourageant.

    Dany

  15. #15
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Change d'hébergeur.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    C'est probablement ce que je vais faire, mais pour l'instant je suis pris avec pour encore presque un an, car je viens tout juste de renouveler mon contrat.

    Merci quand même à vous tous.

    Dany

  17. #17
    Membre confirmé Avatar de tumoo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 309
    Points : 522
    Points
    522
    Par défaut
    Qui est ton hébergeur ?

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous,

    J'ai finalement rejoint le supérieur du technicien et ils ont finalement désactivé la règle 950107 pour mon site web. Puis je dois gérer moi-même l'insertion du % en base de données. Mais avant de « patcher » mon code, j'aimerai savoir s'il y a vraiment un trou de sécurité si je ne le fais pas.

    Tumoo: mon hébergeur est de Montréal et pour l'instant je ne veux pas lui faire mauvaise presse.

    Dany

  19. #19
    Membre expérimenté Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Points : 1 381
    Points
    1 381
    Par défaut
    Le % est protégé surement pour éviter les injections SQL (et autres joyeusetés que je ne connais pas).
    Donc, OUI il faut que tu fasses gaffes.
    Vérifie bien les données entrées par l'utilisateur avant de faire des requêtes avec !

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    C'est bien ce que je pensais, mais je trouve bizarre que dans le manuel PHP sous mysql_real_escape_string l'on retrouve :
    Note: mysql_real_escape_string() n'échappe ni %, ni _. Ce sont des jokers en MySQL si combinés avec LIKE, GRANT, ou REVOKE.

    Si je dois échapper le % avant de le mettre dans ma base de données, pourquoi ne pas l'avoir inclus dans mysql_real_escape_string?

    Dany

Discussions similaires

  1. [C#]Problème d'envoi de caractères spéciaux vers RS232
    Par legillou dans le forum Windows Forms
    Réponses: 5
    Dernier message: 15/11/2007, 17h35
  2. [Debutant] envoi d'un message POST avec une URL
    Par Yannos94 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 14/06/2006, 10h22
  3. [Mail] Envoie de caractère spéciaux par mail() ?
    Par Oberown dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2005, 16h13
  4. Envoi incomplet avec methode post
    Par Tr@nkill dans le forum ASP
    Réponses: 8
    Dernier message: 16/05/2005, 12h14
  5. Envoi de caractères entre applications
    Par Le Mage dans le forum Windows
    Réponses: 5
    Dernier message: 05/08/2004, 16h17

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