Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > HTML / DHTML / XHTML
HTML / DHTML / XHTML Forum sur la programmation HTML / DHTML/ XHTML et la validation W3C. Cours (X)HTML, FAQ (X)HTML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/10/2011, 17h21   #1
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
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 :
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 :
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
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 18h29   #2
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 789
Points : 35 789
Il faut préciser l'attribut enctype du formulaire :
Code :
<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 !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 18h50   #3
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
Merci pour la réponse, mais cela ne change rien, j'ai toujours l'erreur 406 si je mets un % dans le champ.

Dany
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 08h36   #4
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
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é.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 14h39   #5
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
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
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 20h17   #6
Futur Membre du Club
 
Inscription : août 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 16
Points : 17
Points : 17
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)
DDNetweaver est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/10/2011, 22h08   #7
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
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
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 23h12   #8
Futur Membre du Club
 
Inscription : août 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 16
Points : 17
Points : 17
et ça fonctionne en GET ou pas ? t'as une erreur 406 ?
DDNetweaver est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 23h48   #9
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
J'ai toujours l'erreur 406 même en GET.

Dany
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 00h26   #10
Futur Membre du Club
 
Inscription : août 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 16
Points : 17
Points : 17
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)
DDNetweaver est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 01h45   #11
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
J'ai essayé en changent le nom dans input pour dR56_vg avec GET, voici les résultats :

Citation:
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"
Citation:
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
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 02h08   #12
Futur Membre du Club
 
Inscription : août 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 16
Points : 17
Points : 17
ca vient ben de modSecurity

pour t'en convaincre essayes autre chose que %25 par exemple "test%test"
ca devrais marcher je pense
DDNetweaver est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 04h51   #13
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
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
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 20h18   #14
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
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 :
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;", """, "'", "&lt;", "&gt;", ";", ":", "'");
$htm2 = array("&", "\"", "'", "<", ">");
$htm3 = array("<", ">");
$htm4 = array("\"", "'", "<", ">", ":");
$htm5 = array("&amp;", """, "'", "&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
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 00h12   #15
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Change d'hébergeur.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/10/2011, 16h09   #16
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
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
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 16h18   #17
Membre expérimenté
 
Avatar de tumoo
 
Homme
Développeur informatique
Inscription : janvier 2011
Messages : 309
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France, Charente Maritime (Poitou Charente)

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

Informations forums :
Inscription : janvier 2011
Messages : 309
Points : 550
Points : 550
Qui est ton hébergeur ?
tumoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 22h45   #18
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
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
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 13h38   #19
Membre Expert
 
Avatar de Tober
 
Homme Thomas
Ingénieur développement logiciels
Inscription : juillet 2007
Messages : 741
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Âge : 27
Localisation : Luxembourg

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

Informations forums :
Inscription : juillet 2007
Messages : 741
Points : 1 000
Points : 1 000
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 !
Tober est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 15h15   #20
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 12
Points : 0
Points : 0
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
Dany3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h04.


 
 
 
 
Partenaires

Hébergement Web