Aller au contenu

Sujets conseillés

Posté

Salut.

Mon code:

echo"<td>Nom: <input name='Aut1_Nom' type='text' id='Nom' size='31' maxlength='30' value=".$Nom1."></td>";

Mon probleme, c'est que si $Nom1 contient des guillemets, cela coupe mon nom en deux...

Comment faire?

(je suis sur que Kafka a notre epoque aurais ete programmeur)

Posté

T'as essaye de jouer avec les \ pour bloquer les guillemets?

Posté

:lol: Tu as manifestement un problème d'intégration des quotes...

Tu peux utiliser addslashes($Nom1) lors de la création de la chaîne, si tu n'oublies pas d'appeler stripslashes($Nom1) lors de son affichage ;)

Et tu devrais aussi mettre des quotes autour de la valeur, comme dans

echo "value='".addslashes($Nom1)."'></td>";

pour éviter les erreurs de validation ensuite.

Posté

Mets ton expression en singlequotes ', et écrit ton HTML normalement. Si la chaine de caractère possède une apostrophe, précède-là d'un caractère d'échappement \

ça donne un truc comme ça:

echo '<td>Nom: <input name="Aut1_Nom" type="text" id="Nom" size="31" maxlength="30" value="'.$Nom1.'"></td>';

c'est plus sain d'échapper quelques caractères dans ton HTML que mettre tous les attributs en singlequotes !!! ;)

Posté (modifié)

Dites, on parle bien de la même chose ?

Quand on envoie une chaîne de texte vers une sortie on doit *toujours* faire l'échappement adapté. Là il n'y a rien, c'est au mieux un truc qui marche pas dans certains cas, plus probablement une faille de sécurité potentielle (XSS dans ce cas là).

En SQL l'échappement ça peut être addslashes, mysql_real_escape_string(), str_replace("'", "''", ...) et plein d'autres suivant ta base.

En HTML (ton cas) c'est htmlspecialchars(...., ENT_QUOTES) ou htmlentities() si tu préfères.

Je suis effaré de voir que pour tout le monde c'est un addslashes. Ca veut dire que:

- vous ne comprenez pas ce que vous manipulez

- vous ne faites pas habituellement vos échappement pour les envois de texte vers le HTML donc vos codes sont potentiellement aussi troués que ma passoire.

[EDIT: désolé si ça a été pris en agressif, ce dernier paragraphe n'était pas l'intention. Pour moi dire que quelqu'un n'a pas compris n'est pas forcément ni mauvais ni agressif, ni même vraiment critique]

Modifié par Ganf
Posté

Ganf,

Tu as raison pour l'échappement des données du formulaire.

De là à être "effaré" et poster ce type de supposition, tu y vas tout de même un peu fort. :evil:

Il n'entre pas dans les intentions du Hub de donner un cours sur la sécurité Php pour chaque ligne de code que postent nos membres. J'ose espérer que ton livre traite ce sujet.

La question était: "les parenthèses causent problème" ... et la réponse fut : "fais les précéder d'un antislash". L'utilisation que Furious Gontran fait de ses données n'est pas renseignée. Elles peuvent très bien être incluses dans une base de données, et ni toi ni moi n'avons l'info sur base d'une seule ligne de code donnée en exemple.

Merci de poster moins "agressivement".

Posté

Désolé si j'ai pu paraitre agressif, ce n'était pas le but. C'était plutot montrer une (mauvaise) surprise et bien affirmer que addslashes n'est pas la solution, pas taper sur qui que ce soit.

Il n'entre pas dans les intentions du Hub de donner un cours sur la sécurité Php pour chaque ligne de code

Certes, mais pour le coup le problème soumis ici vient uniquement du manque d'échappement.

Dans le code en question ce qu'il manque ce n'est pas un addslashes (qui ne résoudra rien si $Nom contient des apostraphes et/ou guillemets) mais bien un htmlspecialchars().

L'utilisation que Furious Gontran fait de ses données n'est pas renseignée.

Ah ben si, tout de même : la ligne en question c'est un envoi de valeur vers un formulaire HTML. L'utilisation c'est "envoyer du HTML" pour la donnée en question, justement.

la réponse fut : "fais les précéder d'un antislash".

et ... c'est bien pour ça que je me permet de réintervenir : ce n'est pas une solution au problème.

Pour exemple si dans ta solution code j'ai $Nom1 qui contient des apostrophes

echo "<td>Nom: <input name='Aut1_Nom' type='text' id='Nom' size='31' maxlength='30' value='".addslashes($Nom1)."'></td>";

Dans sa page HTML ça va donner :

<td>Nom: <input name='Aut1_Nom' type='text' id='Nom' size='31' maxlength='30' value='voici l\'exemple'></td>

Le navigateur n'interprête pas le \ et le considère comme du texte brut, il arrêtera le contenu de l'attribut value à l'apparition du premier délimiteur (l'apostrophe juste après \) et la valeur sera toujours coupée au milieu.

A la limite on peut faire comme dit Commmint (changer le délimiteur) et on évite le problème avec l'apostrophe mais il apparaittra si au lieu de contenir une apostrophe la valeur contient un guillemet double. Ca n'est donc pas une solution non plus.

Donc oui, même mis à part la sécurité, l'unique bonne solution c'est bien un htmlspecialchars() ou un htmlspecialentities(). Et même mis à part la sécurité, une sortie sur HTML (c'est le cas ici puisque c'est un echo d'un <input>) doit toujours être échappée sinon ça cassera toujours le rendu HTML (et ce cas est un bon exemple).

Addslashes c'est soit pour échapper quand on fait une sortie vers un langage qui prend cette convention d'échappement (le SQL en est un), soit pour composer avec les délimiteurs de PHP lui même dans les chaînes statiques. Jamais pour échapper un contenu vers HTML.

Posté
Désolé si j'ai pu paraitre agressif, ce n'était pas le but. C'était plutot montrer une (mauvaise) surprise et bien affirmer que addslashes n'est pas la solution, pas taper sur qui que ce soit.

Je ne discutais pas sur le fond, mais sur la forme ;)

Tu as parfaitement raison, en ce sens que le htmlspecialchars() permet la transmission sans risque des quotes simples et doubles, des signes < et > et du signe & (ampersand)

Il est clair que laisser ces signes tels-quels permettrait d'envoyer un <script> qui pourrait être interprété par le client.

Cordialement,

Dan

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...