Confusion htmlentities / mysql_real_escape_string / addslashes / stripslashes

Le
Olivier Berquin
Bonjour tout le monde,

J'ai un (gros) soucis de confusions entre htmlentities /
mysql_real_escape_string / addslashes / stripslashes.

J'ai un soucis lorsque les données contiennent une apostrophe ou une
esperluette (&).

Ma question est la suivante:
- que dois-je faire pour encoder mes données dans MySQL (?
- que dois-je faire pour les afficher?

J'insère par exemple ceci dans un champ "TEXT": "J'essaie d'introduire
des apostrophes & une esperluette"
Si j'utilise mysql_real_escape_string(), le signe & et le fin du champ
disparaisse.

D'autre part, je n'arrive pas à afficher correctement ce champ dans
une page PHP.
J'ai ceci dans mon code:
htmlEntities(stripslashes($li_job->jo_resume))

Je m'arrache les cheveux

Une âme charitable aurait la bonté de m'aider???

MERCI !

Oli.
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickaël Wolff
Le #21916971
Olivier Berquin a écrit :
Bonjour tout le monde,


Bonjour :)

Une âme charitable aurait la bonté de m'aider???


1- bannir stripslashes pour la protection des données.
2- utiliser les fonctions dédiées de protection des données de
l'interface.

Donc ça dépend de ce que tu utilises comme outil. Mais en gros, la
fabrication d'une requête SQL va mettre en œuvre
mysqli::real_escape_string lorsque tu utilises un objet mysqli et la
méthode mysqli::query.

Pour produire le document HTML (une application web n'affiche
jamais), ça dépend comment tu t'y prends. Avec de bêtes echo/print, il
faut utiliser htmlentities (normalement, sur toutes les données que tu
intègre au document). Si tu utilises DOMDocument, ou Tidy, etc, il se
peut que tu n'ai pas besoin d'échapper quoique ce soit (mais il y a un
piège avec DOMDocument).

Bref, comme tu peux le voir il y a de nombreuses manières de traiter
les données. Le mieux est encore de lire attentivement la documentation
et d'être conscient des implications des données que tu formate.

Il n'y a pas de recette magique à appliquer bêtement.

Les recettes magiques prodiguées ont souvent été, par la suite,
considérées comme des mauvaises pratiques.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position
Olivier Berquin
Le #21916961
Merci pour la réponse, mais... ça ne m'aide pas trop...

Voici un exemple un peu plus concret:

Pour écrire mes données dans ma db (MySQL 5.0.67-log), j'utilise
mysql_real_escape_string().
Lorsque je "tape" la phrase suivante dans mon champ: "Essaie d'encoder
du texte & une esperluette", j'ai dans ma db le texte suivant: "Essaie
d'encoder du texte ".

Comment faire pour que l'esperluette (et donc la fin de la phrase)
passe correctement?

Merci...

Oli.
Olivier Miakinen
Le #21916951
Le 06/07/2009 14:14, Olivier Berquin a écrit :

Voici un exemple un peu plus concret:

Pour écrire mes données dans ma db (MySQL 5.0.67-log), j'utilise
mysql_real_escape_string().
Lorsque je "tape" la phrase suivante dans mon champ: "Essaie d'encoder
du texte & une esperluette", j'ai dans ma db le texte suivant: "Essaie
d'encoder du texte ".



Je sors ma boule de cristal... Hmmm... Tu as vraiment ce texte dans la
base de données, ou bien tu essayes de l'afficher via une page HTML ?
Dans ce dernier cas, que donne « Afficher le code source de la page » ?

Attention : ma boule de cristal n'a jamais très bien marché, il y a
toutes les chances qu'elle se soit encore trompée, mais ça ne me coûtait
rien d'essayer.
Olivier Berquin
Le #21916941
On 6 juil, 15:30, Olivier Miakinen
Le 06/07/2009 14:14, Olivier Berquin a écrit :



> Voici un exemple un peu plus concret:

> Pour écrire mes données dans ma db (MySQL 5.0.67-log), j'utilise
> mysql_real_escape_string().
> Lorsque je "tape" la phrase suivante dans mon champ: "Essaie d'encoder
> du texte & une esperluette", j'ai dans ma db le texte suivant: "Essaie
> d'encoder du texte ".

Je sors ma boule de cristal... Hmmm... Tu as vraiment ce texte dans la
base de données, ou bien tu essayes de l'afficher via une page HTML ?
Dans ce dernier cas, que donne « Afficher le code source de la page » ?



L'utilisateur devrait pouvoir introduire ce texte dans un formulaire.
Je dois donc pouvoir écrire cela dans ma db, et aussi pouvoir
l'afficher en HTML.


Attention : ma boule de cristal n'a jamais très bien marché […]



Dommage, ce serait un excellent outil !

Oli.
Olivier Miakinen
Le #21916931
Le 07/07/2009 09:16, Olivier Berquin a écrit :

> [texte coupé à partir de l'esperluette &]

Je sors ma boule de cristal... Hmmm... Tu as vraiment ce texte dans la
base de données, ou bien tu essayes de l'afficher via une page HTML ?
Dans ce dernier cas, que donne « Afficher le code source de la page » ?



L'utilisateur devrait pouvoir introduire ce texte dans un formulaire.
Je dois donc pouvoir écrire cela dans ma db,



Oui, je suis d'accord. Et finalement tu n'as pas répondu : le texte a
finalement été écrit dans la base de données ou pas ?

et aussi pouvoir l'afficher en HTML.



Oui, mais c'est un deuxième problème. Tu dois savoir que le caractère
& a une signification spéciale en HTML (ainsi que quelques autres, par
exemple le <), et donc il faudra l'« échapper » avant de l'afficher.
Le traitement ne sera pas le même selon que tu le mettes dans une valeur
d'attribut, en particulier comme url, ou dans du simple texte. Mais
encore une fois tout ceci est complètement indépendant de la saisie et
du stockage en base de données.
Olivier Berquin
Le #21916921
> L'utilisateur devrait pouvoir introduire ce texte dans un formulaire.
> Je dois donc pouvoir écrire cela dans ma db,

Oui, je suis d'accord. Et finalement tu n'as pas répondu : le texte a
finalement été écrit dans la base de données ou pas ?



Oui et non...
Je suis en phase de test. Je dois pouvoir accepter que l'utilisateur
utilise n'importe quel caractère.
Donc:
1- quelles fonctions dois-je utiliser pour protéger mes données avant
de les écrire dans ma db (je suis quasi sûr qu'il s'agit de
mysql_real_escape_string())?
2- quelles fonctions (méthode) dois-je utiliser pour afficher ce
contenu de ma db?


> et aussi pouvoir l'afficher en HTML.

Oui, mais c'est un deuxième problème. Tu dois savoir que le caractè re
& a une signification spéciale en HTML (ainsi que quelques autres, par
exemple le <), et donc il faudra l'« échapper » avant de l'afficher .
Le traitement ne sera pas le même selon que tu le mettes dans une valeu r
d'attribut, en particulier comme url, ou dans du simple texte. Mais
encore une fois tout ceci est complètement indépendant de la saisie e t
du stockage en base de données.



Oui, oui, j'ai bien compris cela.
Je voudrais savoir s'il y a une méthode qui dise: si tu utilises tel
"type d'écriture" dans la db, tu dois utiliser tel "type
d'affichage" (en HTML).

Je ne suis pas sûr de bien m'expliquer...

Oli.

NB En tout cas, merci pour ton aide.
Olivier Miakinen
Le #21916911
Le 07/07/2009 11:55, Olivier Berquin a écrit :

Oui, je suis d'accord. Et finalement tu n'as pas répondu : le texte a
finalement été écrit dans la base de données ou pas ?



Oui et non...



???

C'est oui ou c'est non ?

Je suis en phase de test. Je dois pouvoir accepter que l'utilisateur
utilise n'importe quel caractère.



Il me semble assez logique, phase de test ou pas, que l'on veuille
autoriser l'utilisateur à saisir un « & ».

Donc:
1- quelles fonctions dois-je utiliser pour protéger mes données avant
de les écrire dans ma db (je suis quasi sûr qu'il s'agit de
mysql_real_escape_string())?



Je ne suis pas un spécialiste, mais il semble en effet que cette
fonction soit la seule à utiliser dans le cas de MySQL.

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
</>

2- quelles fonctions (méthode) dois-je utiliser pour afficher ce
contenu de ma db?



La réponse à cette question dépend d'où tu affiches ce contenu !

Pour l'envoyer dans un fichier texte, il ne doit y avoir besoin d'aucun
traitement spécial ; pour l'envoyer dans un fichier de type CSV avant de
l'importer dans un programme acceptant le CSV, tu choisis le traitement
adapté au CSV ; pour l'envoyer dans la partie query d'une URL, tu peux
utiliser urlencode() ; pour l'envoyer comme contenu d'un fichier HTML,
tu peux utiliser htmlspecialchars() ; et ainsi de suite.

Note que la réponse serait exactement la même pour toute chaîne de
caractères, même écrite en dur dans ton programme plutôt que lue à
partir d'une base de données.

> et aussi pouvoir l'afficher en HTML.

Oui, mais c'est un deuxième problème. [...] Mais
encore une fois tout ceci est complètement indépendant de la saisie et
du stockage en base de données.



Oui, oui, j'ai bien compris cela.



Je n'en ai pas l'impression (mais c'est peut-être moi qui n'ai pas
compris, ça vient déjà de m'arriver sur fciwn).

Je voudrais savoir s'il y a une méthode qui dise: si tu utilises tel
"type d'écriture" dans la db, tu dois utiliser tel "type
d'affichage" (en HTML).



Ben non. Ou alors tu parles du problème des charsets ?

Je ne suis pas sûr de bien m'expliquer...



Je ne suis pas sûr de bien comprendre... mais attention, ce n'est pas
forcément de ta faute.
Xavier Nayrac
Le #21916901
Olivier Berquin a écrit :
L'utilisateur devrait pouvoir introduire ce texte dans un formulaire.
Je dois donc pouvoir écrire cela dans ma db,


Oui, je suis d'accord. Et finalement tu n'as pas répondu : le texte a
finalement été écrit dans la base de données ou pas ?



Oui et non...



La question d'Olivier Miakinen est pertinente.
Il faut savoir si tu essais de sortir un truc qui existe ou pas.
Que donne un select * dans une console, ou dans phpmyadmin ?

1- quelles fonctions dois-je utiliser pour protéger mes données avant
de les écrire dans ma db (je suis quasi sûr qu'il s'agit de
mysql_real_escape_string())?



Je dirai oui.

2- quelles fonctions (méthode) dois-je utiliser pour afficher ce
contenu de ma db?



htmlentities()

--
Xavier Nayrac
http://personalbugtracker.free.fr
Publicité
Poster une réponse
Anonyme