PHP, champs cachés et anti-slashes d'échappement
Hors ligneGodot Le 21/10/2007 à 23:23 Profil de Godot Configuration de Godot

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 du code sur lequel je travaille.


<!-- ***************** 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.
Hors ligneBrako Le 03/11/2007 à 11:31 Profil de Brako Configuration de Brako

bonjour

je sais pas si tu as resolu ton problème mais je vais quand même prendre le temps de te répondre. En effet il existe deux fonctions: addslashes() et stripslashes() qui permettent respectivement d'ajouter ou de retirer des antislashes.

Bon dejà je comprends pas bien ton code tu utilises des fonctions avant de les annoncer ?.  Moi je mettrais toutes mes fonctions dans un fichier fonctions.php que j'appellerais en debut de ton index.php par un include.

Sinon si j'ai bien compris tu as un problème pour appliquer ces fonctions sur une variable de type $_POST d'un champ de type hidden.

Alors pour un champ :
<input type="hidden" name="text">

tu peux le traiter comme ceci :

<?php 
$text 
addslashes($_POST['text']);
echo 
$text//tu as les antislashes

//et

$text stripslashes($_POST['text']);
echo 
$text//tu as plus les antislashes
?>


Je suis sûr que je suis à côté de la plaque mais si tu px m'en dire plus sur ton code, à savoir de me duire l'endroit exact de ton erreur dans le code, je pourrais mieux t'aider.

ps : sa sert à quoi la fonction get_magic_quotes_gpc()?

bonne continuation
--
Ce qui donne une éventuelle matière à suspecter une quelconque propagande ...
Hors ligneGodot Le 07/11/2007 à 00:58 Profil de Godot Configuration de Godot

Godot a écrit :

J'ai essayé toutes les combinaisons de addslashes et stripslashes, pas moyen de faire en sorte de les gérer correctement.


J'ai eu l'occasion de noter que des gens qui posent des questions sur le php postent des sources - quand ils en postent - sorties de leur contexte et qu'il faut interpréter instruction par instruction pour les comprendre. D'où que je me sois dit que j'allais faire un modèle réduit de mon problème de sorte que la source que je posterai pourrait être copiée-collée directement dans un fichier index.php, et ainsi aider celui qui voudrait m'aider à voir facilement ce qui se passe. Apparemment, c'était une mauvaise idée, puisque partout où j'ai posté la question, personne ne semble avoir saisi mon intention.

Le problème précis tient à ce que le champ hidden (dans la fonction previsualisation()) interprète les guillemets de la chaîne même s'ils sont échappés avec l'anti-slash. En fait, le problème se pose partout où la valeur est entrée dans la valeur d'un attribut dans une balise, et non entre des balises ouvrantes et fermantes. Il ne se pose pas avec la balise TEXTAREA ou SELECT OPTION, mais se pose par exemple avec INPUT TYPE=TEXT ou, comme ici, avec INPUT TYPE=HIDDEN. J'ai finalement résolu le problème en remplaçant les guillemets par leurs entités html correspondantes. C'est pas très élégant mais c'est suffisant, car dans la source sur laquelle je travaille, le texte est tapé en bbcode et, donc, de toutes façons, il y a des remplacements à faire.

Pour la question en post-scriptum, les serveurs peuvent configurer php.ini de sorte à ce que les anti-slashes soient ajoutés automatiquement ou pas, et il faut évidemment que la source fonctionne dans les deux cas. La fonction get_magic_quotes_gpc() permet de le tester, elle renvoie vrai ou faux selon le cas. Dans ma source, je l'ai mise en début de code pour des raisons de déboggage.

Voilà, voilà.

En tout cas, merci pour ta réponse, et bonne continuation à toi aussi.
Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels