Enregistrer proprement les données d'un formulaire ?

WRInaute passionné
Bonjour,

Je "patauge" sur la façon d'enregistrer proprement les données d'un formulaire en BD.
Supposons un simple input qui doit être enregistré bd:
Code:
<input name="titre" size="65" value="<?php if (!empty($_POST["titre"])) { echo $_POST["titre"]; } ?>" type="text"/>
Utilisez-vous sur le "echo" la fonction "ENT_QUOTES" et/ou "htmlspecialchars" et/ou "stripslashes" ou rien?
Idem sur un textarea ou tout autre élément d'un formulaire ?

Note : utilisation de "mysql_real_escape_string" lors de l'insertion et PHP 5.

Merci
 
WRInaute passionné
Merci de ta réponse :)
spout a dit:
Pour populer le form, htmlspecialchars() oui.
Visiblement, htmlspecialchars() seul ne suffit pas car si j'enregistre &é"'(, j'ai de jolies /. Je suis donc obligé d'utiliser stripslashes() en plus pour ré-afficher correctement $_POST["titre"].
Du coup si je lis la variable $titre en sortie de bd, il faut également que j'utilise stripslashes() sur celle-ci.
 
WRInaute accro
Si tu dois faire un stripslashes, c'est que les magic quotes sont activées ... c'est une très mauvaise pratique, à désactiver au plus vite.
 
WRInaute passionné
spout a dit:
Si tu dois faire un stripslashes, c'est que les magic quotes sont activées ... c'est une très mauvaise pratique, à désactiver au plus vite.
Je fais des testes sur free.fr ou visiblement magic quote est activé et sous 1&1 ou magic quote est désactivé. Comme je me construit un "CMS maison", j'ai besoin que ça fonctionne sur les 2 sans tracas ...
Pour ce faire, je me suis créé la fonction suivante :
Code:
function clean($chaine){
	//si magic quote activé
	if(get_magic_quotes_gpc()){
		$chaine = htmlspecialchars(stripslashes($chaine));
	}
	else{
		$chaine = htmlspecialchars($chaine, ENT_COMPAT , 'ISO-8859-1');
	} 
	return $chaine; 
}
J'utilise cette fonction sur le ré-affichage du formulaire comme ci-dessous et sur tout les champs :
Code:
<input name="titre" size="65" value="<?php if(isset($_POST["titre"])) echo clean($_POST["titre"]); else echo $titre; ?>" type="text"/>
Et avant enregistrement en bd comme ci-dessous :
Code:
$titre = clean($_POST["titre"]);

Comme j'utilise ckfinder en éditeur, j'utilise la fonction htmlspecialchars_decode() en sortie sur la variable concerné sinon je me retrouve avec une bouillie de texte ...

Après quelques testes sur les 2 serveurs, cela semble fonctionner sans erreur :mrgreen: mais je ne suis pas certains que ma solution soit la meilleurs ... qu'en penses-tu?
 
WRInaute passionné
Hargggggggggggg 8O
C'est à l'affichage que tu dois faire les htmlspecialchars/htmlentities.
Juste avant tu me dis :
Code:
Pour populer le form, htmlspecialchars() oui.
Du coup, htmlspecialchars c'est à l'affichage ou avant enregistrement ou les 2 ... je suis largué!

Concernant le lien, tu me dis si j'ai faux... on utilise stripslashes si magic quote est activé sinon on utilise rien et on passe les variables avant enregistrement avec mysql_real_escape_string .. j'ai bon?
 
WRInaute passionné
Autre question, les slach /, il faut les enregistrer en bd ou les virer avant enregistrement?
 
WRInaute accro
Il n'y a rien à virer, juste faire gaffe lors des requêtes SQL pr éviter l'injection, tu laisses faire mysql_real_escape_string.

test.php:
PHP:
<span class="syntaxhtml"><!DOCTYPE HTML><br /><html lang="en-US"><br /><head><br />    <meta charset="UTF-8"><br />    <title></title><br /></head><br /><body><br />    <form action="<span class="syntaxdefault"><?php echo $_SERVER</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'REQUEST_URI'</span><span class="syntaxkeyword">];</span><span class="syntaxdefault">?></span>" method="post"><br />        <input type="text" name="title" value="<span class="syntaxdefault"><?php if</span><span class="syntaxkeyword">(isset(</span><span class="syntaxdefault">$_POST</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'title'</span><span class="syntaxkeyword">])</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">&&</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">!empty(</span><span class="syntaxdefault">$_POST</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'title'</span><span class="syntaxkeyword">])):</span><span class="syntaxdefault">?><?php echo htmlspecialchars</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$_POST</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'title'</span><span class="syntaxkeyword">]);</span><span class="syntaxdefault">?><?php endif</span><span class="syntaxkeyword">;</span><span class="syntaxdefault">?></span>" /><br />        <input type="submit" value="Submit" /><br />    </form><br />    <span class="syntaxdefault"><?php if</span><span class="syntaxkeyword">(!empty(</span><span class="syntaxdefault">$_POST</span><span class="syntaxkeyword">)):</span><span class="syntaxdefault">?><br /></span>        <pre><span class="syntaxdefault"><?php print_r</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$_POST</span><span class="syntaxkeyword">);</span><span class="syntaxdefault">?></span></pre><br />    <span class="syntaxdefault"><?php endif</span><span class="syntaxkeyword">;</span><span class="syntaxdefault">?><br /></span></body><br /></html><br /></span>
Rempli l'input avec:
Code:
&&&<<<>>>"""
Submit le form 1 fois, puis tu affiches le source:
PHP:
<span class="syntaxdefault"></span><span class="syntaxkeyword"><</span><span class="syntaxdefault">input type</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"text"</span><span class="syntaxdefault"> name</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"title"</span><span class="syntaxdefault"> value</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"&amp;&amp;&amp;&lt;&lt;&lt;&gt;&gt;&gt;&quot;&quot;&quot;"</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">/></span><span class="syntaxdefault"> </span>
Submit le form 2 fois et tu obtiens:
Code:
Array
(
    [title] => &&&<<<>>>"""
)
 
WRInaute passionné
Quand je submit le form 1 fois en utilisant juste htmlspecialchars(), j'obtiens :
Code:
<input name="titre" value="&amp;&amp;&amp;&lt;&lt;&lt;&gt;&gt;&gt;\&quot;\&quot;\&quot;" type="text"/>
En Bd j'obtiens :
Code:
&&&<<<>>>\"\"\"
Je suis bien obligé d'utiliser stripslashes() à un moment donné .. non?
Si oui, avant enregistrement en Bd ou en sortie?
Si non, c'est que j'ai toujours rien comprit malgré ton acharnement à m'expliquer :oops:
 
WRInaute accro
C'est parce que les magic quotes sont activés :roll:
Dans le lien que je t'ai donné plus haut, il y a plusieurs exemples:
http://www.php.net/manual/en/function.get-magic-quotes-gpc.php#81675
http://www.php.net/manual/en/function.get-magic-quotes-gpc.php#95697
http://www.php.net/manual/en/function.get-magic-quotes-gpc.php#82524

Pr virer toutes ces magic quotes hors de $_GET, $_POST, $_COOKIE. Donc en effet, ça fait un stripslashes() automatique si get_magic_quotes_gpc() est activé. Mais dans ton code tu t'en soucies plus.
De plus magic_quotes_gpc, est déprécié PHP 5.3, et en PHP 5.4 supprimé.
http://www.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc
 
Discussions similaires
Haut