Précédent   Forum des professionnels en informatique > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
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 22/10/2007, 00h13   #1
Invité régulier
 
Inscription : juin 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 7
Points : 6
Points : 6
Par défaut Champs cachés et anti-slashes d’échappement

Bonjour,

Comme celui qui va me répondre (j’espère !!) le sait très bien, afin de ne pas confondre les guillemets qui servent à désigner une valeur littérale avec les guillemets qui se trouvent DANS la valeur littérale, on utilise des anti-slashs qu’il faut ajouter et supprimer dans les allés et retours du code. C’est comme ça qu’une chaîne telle que
  • l'autre

se promène dans le code sous la forme
  • l\'autre

L’anti-slash doit, bien sûr, être enlevé avant d’afficher la chaîne.

Seulement voilà, je me prends le chou avec le champ caché (<input type=hidden …>) qui semble ne pas prendre en considération le caractère d’échappement et tronque tout ce qui suit l’apostrophe.

Pour bien montrer ce dont je parle, voici un modèle réduit (néanmoins opérationnel) du code sur lequel je travaille.

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
<!-- ***************** fichier index.php *************** -->
 
<html><head></head><body><?php
if (get_magic_quotes_gpc()) echo "Le slashes automatiques sont ON" ; 
elseif (!get_magic_quotes_gpc()) echo "Le slashes automatiques sont OFF" ;
 
echo "<table width=100%><tr><td width=20%>La variable passée : " . 
	htmlentities($_POST['texte']) . " " . htmlentities($_POST['passe_texte']) . "</td><td><center>" ;
 
// Dispatche soit vers l'éditeur, soit vers la prévisualisation
if($_POST['vers_pre']) echo previsualisation() ;
elseif (!$_POST['vers_pre'] or $_POST['vers_ed']) echo editeur() ;
echo "</center></td><td width=20%>&nbsp;</td></tr></table>" ;
 
// Editeur qui permet de saisir du texte
function editeur()
	{
	$retour = "<h1>Editeur</h1>
			<form action='index.php' method='post' name='post'>
			<textarea name='texte' style='border:1px solid red;width:200px;height:200px'>" . 
				 $_POST['passe_texte'] .
			"</textarea><br>
			<input type='submit' name='vers_pre' value='Prévisualiser' style='width:200px'>
			</form>";
	return $retour ;
	}
 
//La prévisualisation qui sert à voir le résultat de la mise en forme
function previsualisation()
	{
	$retour = "<h1>Prévisualisation</h1>
			<form action='index.php' method='post' name='post'>
			<div style='border:1px solid blue;width:200px;height:200px;text-align:left'>" . 
				$_POST['texte'] . 
			"</div>
			<input type='submit' name='vers_ed' value='Editer' style='width:200px'>
			<input type=hidden value='" . addslashes($_POST['texte']) . "' name=passe_texte>
			</form>";
	return $retour ;
	}
?></body></html>
J’ai essayé toutes les combinaisons de addslashes et stripslashes, pas moyen de faire en sorte de les gérer correctement.

Si quelqu’un a une idée, je suis preneur.

Merci d'avance

Godot
Godot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2007, 00h18   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par Godot
Comme celui qui va me répondre (j’espère !!) le sait très bien, afin de ne pas confondre les guillemets qui servent à désigner une valeur littérale avec les guillemets qui se trouvent DANS la valeur littérale, on utilise des anti-slashs qu’il faut ajouter et supprimer dans les allés et retours du code.
Certainement pas : vous devez les retranscrire par leur entité HTML correspondante (fonction htmlspecialchars en précisant bien le second paramètre avec une valeur ENT_QUOTES).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2007, 00h36   #3
Invité régulier
 
Inscription : juin 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 7
Points : 6
Points : 6
Bah non, ça ne va pas.

Citation:
Envoyé par php.net
htmlspecialchars() est pratique pour éviter que des données fournies par les utilisateurs contiennent des balises HTML, comme pour un forum ou un chat.
Or je ne veux pas que les balises html soient remplacées.

Et même si je l'avais voulu, comment ça se fait que hidden ne tient pas compte des caractères d'échappement alors que les autres champs de formulaire le font?
Godot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2007, 01h39   #4
Invité régulier
 
Inscription : juin 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 7
Points : 6
Points : 6
Mouais, j'ai trouvé une solution, mais je ne la trouve pas très élégante. De plus, julp m'a donné l'impression qu'il y a un problème avec la logique de mon code.

J'en saurais peut être un peu plus au retour de mon voyage, dans quelques jours.

En attendant, voici une solution provisoire.

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
<html><head></head><body><?php
if (get_magic_quotes_gpc()) echo "Le slashes automatiques sont ON" ; 
elseif (!get_magic_quotes_gpc()) echo "Le slashes automatiques sont OFF" ;
 
echo "<table width=100%><tr><td width=20%>La variable passée : " . 
	htmlentities($_POST['texte']) . " " . htmlentities($_POST['passe_texte']) . "</td><td><center>" ;
 
// Dispatche soit vers l'éditeur, soit vers la prévisualisation
if($_POST['vers_pre']) echo previsualisation() ;
elseif (!$_POST['vers_pre'] or $_POST['vers_ed']) echo editeur() ;
echo "</center></td><td width=20%>&nbsp;</td></tr></table>" ;
 
// Editeur qui permet de saisir du texte
function editeur()
	{
	$retour = "<h1>Editeur</h1>
			<form action='test.php' method='post' name='post'>
			<textarea name='texte' style='border:1px solid red;width:200px;height:200px'>" . 
				 unconvert_quotes($_POST['passe_texte']) .
			"</textarea><br>
			<input type='submit' name='vers_pre' value='Prévisualiser' style='width:200px'>
			</form>";
	return $retour ;
	}
 
// La prévisualisation qui sert à voir le résultat de la mise en forme
function previsualisation()
	{
	$retour = "<h1>Prévisualisation</h1>
			<form action='test.php' method='post' name='post'>
			<div style='border:1px solid blue;width:200px;height:200px;text-align:left'>" . 
				unconvert_quotes($_POST['texte']) . 
			"</div>
			<input type='submit' name='vers_ed' value='Editer' style='width:200px'>
			<input type=hidden value='" . convert_quotes($_POST['texte']) . "' name=passe_texte>
			</form>";
	return $retour ;
	}
 
// Fonctions de conversion
function convert_quotes($texte)
	{
	return str_replace('\"', '"', str_replace('\'', ''', $texte)) ;
	}
 
function unconvert_quotes($texte)
	{
	if (!get_magic_quotes_gpc()) return stripslashes($texte) ;
	if (get_magic_quotes_gpc()) return stripslashes(stripslashes($texte)) ;
	}
?></body></html>
(euh ... dans la fonction convert_quotes(), il faut bien sûr lire &quot; et & #039; à la place des guillemets doubles et simples.)
Godot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2007, 01h45   #5
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
C'est normal car l'attribut value commence par un '
et que tu fais un echo de ton champ ce qui donnera en html
<input type='hidden' value=' le texte avec des apostrophes échappées\' <= Value s'arretera donc dés qu'il trouvera un apostrophe , échappé ou non

essaie :
Code :
1
2
 
<input type=hidden value=\"" . addslashes($_POST['texte']) ."\" name='passe_texte'>
ce qui donnera en html
Code :
1
2
 
<input type=hidden value="le texte non échapp'é ou éch\'appé"
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2007, 11h12   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Ça ne change véritablement rien au problème : lorsque que vous aurez une double quote, vos données ne passeront plus non plus ...

Si vous ne souhaitez pas altérer les autres caractères spéciaux du point de vue du "langage" HTML, j'imagine que vous pouvez procéder ainsi (pour injecter une valeur dans un champ de formulaire) :
Code :
1
2
3
function convert_quotes($string) {
    return str_replace(array('"', "'"), array('"', '&apos;'), $string);
}
Par contre, vous avez l'air de ne pas vous en sortir avec les magic_quotes. Vous pourriez utiliser la méthode de is_null pour vous en débarrasser et les gérer vous-mêmes ensuite.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 22h52   #7
Invité régulier
 
Inscription : juin 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 7
Points : 6
Points : 6
Merci pour vos réponses. Je vais méditer ça.
Godot est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h48.


 
 
 
 
Partenaires

Hébergement Web