[RESOLU] htmlentities, htmlspecialchars et ASCII.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] htmlentities, htmlspecialchars et ASCII.

Re: htmlentities, htmlspecialchars et ASCII.

par niconicochan » 02 déc. 2014, 18:29

Bon, je viens de contourner le problème en nettoyant les données postées via mysqli_real escape_string
juste avant l'échange des données.
Du coup, mon problème est résolu.

Je serais néanmoins curieux de savoir d'où pouvait venir le message d'erreur SQL.

Dans tous les cas, bien sûr, je suis content que le problème soit résolu.

Re: htmlentities, htmlspecialchars et ASCII.

par niconicochan » 02 déc. 2014, 14:53

Bon, je touche quasiment à la fin :D

Problème d'oubli d'un mysqli_connect derrière le premier mysqli_query.
Les autres mysqli_connect ne sont effectivement pas nécessaires :D

J'ai enlevé mon antislash devant l'apostrophe dans mon motif
et j'ai mis des doubles apostrophes au lieu de simples apostrophes aux extémités, comme cela:
$motif = "/^[a-zA-Z0-9àäâçèéëêùüûïî!?. '-]{1,2000}$/";
C'est la fonction de nettoyage mysqli_real_escape_string qui me rajoute l'antislash, dans:
$commentaires_modif = mysqli_real_escape_string($connexion, $commentaires_modif);
Je rajoute à la suite:
$commentaires_modif=stripslashes($commentaires_modif);
ce qui a pour résultat de résoudre mon problème, ainsi le formulaire de modification
sur lequel l'utilisateur a cliqué sur modifier sans apporter de modification permet
de diriger ce dernier vers un message d'erreur comme quoi rien a été modifié.
(ce qui est plus sympa que le message général indiquant que les modifications apportées ont bien été enregistrées
lorsque aucune modification n'a été apportée => cette ligne de code est censée résoudre ce problème)
Mais avec cette dernière ligne de code si une modification est apporté dans le champs commentaires,
alors le serveur renvoit:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for
the right syntax to use near 'attends votre réponse le plus tôt possible. Merci bien.' WHERE id_user='1' AND' at line 1

J'ai aucune idée pourquoi ce message apparaît. Quelqu'un a une idée?

Il suffit bien sûr que j'enlève la ligne
$commentaires_modif=stripslashes($commentaires_modif);
et je n'est plus de message d'erreur SQL, mais l'utilisateur est alors remercié d'avoir apporté des modifications même
lorsqu'il a simplement appuyé sur modifier sans rien modifié, car
J'attends votre réponse le plus tôt possible. Merci.
et
J\'attends votre réponse le plus tôt possible. Merci.
c'est différent!!

Re: htmlentities, htmlspecialchars et ASCII.

par xTG » 01 déc. 2014, 16:03

que j'ai mis derrière chaque mysqli_query
Un seul après le mysqli_connect suffit amplement. ;)
Comment faut-il faire pour faire enregistrer mes données dans mes formulaires en UTF-8?
Simplement appliquer le contenu de son tutorial.
Ni plus, ni moins.
Si tu as des ? c'est que tu as oublié une étape.
Le deuxième point, c'est à propos de l'apostrophe ' quant au champs commentaires.
Il y a une configuration dans le php.ini qui échappe les données envoyées par les formulaires.
Je n'ai malheureusement plus son nom sous la main, mais elle serait en cause (elle est d'ailleurs obsolète et désactivée dans les dernières versions PHP).
Edit : je crois me souvenir qu'ils s'agit des MAGIC QUOTES.
A moins que tu ais un addslashes() qui se balade dans ton code.

Re: htmlentities, htmlspecialchars et ASCII.

par niconicochan » 01 déc. 2014, 13:58

Si, pour le généré il me manquait effectivement
mysqli_query($connexion, "SET NAMES 'utf8'");
que j'ai mis derrière chaque mysqli_query
Maintenant ça marche, le réaffichage dans le second formulaire est correct :D

Tout est pratiquement bon, il me reste juste deux petits soucis dont j'aimerais vous soumettre :oops:
(ce serait lourd d'écrire deux messages pour chaque vu qu'il s'agit de petites choses, ... mais sur lesquels je bloque quand même)

Dans mon fichier de 2ème formulaire, je récupère mes données en bdd via un tableau associatif.
Un echo $commentaires (variable qui vient donc de la bdd) dans cette page de traitement du second formulaire fait afficher un point d'interrogation blanc
dans un losange noir à la place de la lettre é
Le tuto de AB sur l'UTF-8 précise que le navigateur affiche les données en pensant avoir affaire à de l'UTF-8
alors que les données ont été enregistrées en ISO
=> donc il faut que sur mes deux formulaires les données soient enregistrées en UFT-8
C'est pour cela que j'ai une difficulté.
Comment faut-il faire pour faire enregistrer mes données dans mes formulaires en UTF-8?

Le deuxième point, c'est à propos de l'apostrophe ' quant au champs commentaires.
J'utilise une expression régulière avec un motif pour le champs commentaires:
$motif = '/^[a-zA-Z0-9àäâçèéëêùüûïî!?. \'-]{1,2000}$/';
Le réaffichage des commentaires dans les formulaires est bon.
Exemple:
J'attends votre réponse de confirmation.
Dans ma bdd, j'ai également:
J'attends votre réponse de confirmation.
Mais si je fais un echo ou un var_dump pour le champs des commentaires
dans mon fichier de traitement de 2ème formulaire, j'ai alors:
J\'attends votre réponse de confirmation.
Ceci peut poser problème lors d'une comparaison entre les valeurs postées
et les valeurs en bdd, car
J'attends votre réponse de confirmation.
n'a pas la même valeur que:
J\'attends votre réponse de confirmation.
N'y a -t-il pas moyen pour qu'une apostrophe ' ressort ' et non \' dans un echo ou un var_dump?
Mais je dois dire ne pas comprendre pourquoi l'apostrophe qui semble être aussi un métacaractère
doit être échappée dans un intervalle de classe, sachant que l'échappement des métacaractères se fait
seulement à l'extérieur des intervalles de classe (l'apostrophe ' non échappée dans un intervalle de classe génère
un message d'erreur de l'éditeur).

Re: htmlentities, htmlspecialchars et ASCII.

par xTG » 28 nov. 2014, 09:21

Ton code d'update ne gère donc pas l'utf-8.
As-tu bien reporté ce que tu as fait pour la requête insert ?

Re: htmlentities, htmlspecialchars et ASCII.

par niconicochan » 27 nov. 2014, 21:31

En fait ça avance :D

Les données envoyées par le formulaire rentrent dans la base de données.
J'écris
J'attends une réponse de votre part. Merci.
Dans ma bdd j'ai bien
J'attends une réponse de votre part. Merci.
:D
Ensuite, mon fichier récapitulatif, qui est en fait un deuxième formulaire pré-rempli,
se pré-rempli avec les données que j'ai dans ma bdd.
Pour le champs commentaires apparaît à l'écran:
J'attends une réponse de votre part. Merci.
:D

C'est après que ça se gâte.
Si ensuite l'utilisateur clique sur modifier, les données postées
(modifiées ou pas modifiées) sont récupérées dans une page de traitement de formulaire,
et les données "correspondantes avant modification" sont elles-aussi récupérées dans
la même page de traitement de formulaire.
Je remplace ensuite dans la bdd les valeurs rentrées lors de l'envoi du premier formulaire
par les valeurs modifiées (ou pas modifiées) avec le deuxième formulaire.
Un lien reconduit alors au même formulaire, et l'opération de modification se fait en boucle
tant que l'utilisateur veut apporter des modifications.
Quand il est satisfait, depuis le deuxième formulaire il peut sortir de la session ou faire autre chose,
ou faire une autre réservation,... à lui de voir.

Je reprends, je disais: après ça se gâte.
Si ensuite en tant qu'utilisateur j'appuie sur modifier sans avoir modifié
le champs des commentaires, l'échange des données se fait même si je ne change pas
de valeurs, il s'agit alors d'un échange par les mêmes valeurs, et du coup dans ma bdd voilà ce que j'ai:
J'attends une réponse de votre part. Merci.
Et lorsque je reviens sur le deuxième formulaire, voilà ce que j'ai dans le champs commentaires:
J'attends une réponse de votre part. Merci.

Re: htmlentities, htmlspecialchars et ASCII.

par niconicochan » 27 nov. 2014, 19:52

Oui, j'ai envoyé une nouvelle ligne par le formulaire:
J'attends votre réponse. Merci.

Dans ma bdd j'ai:
J'attends votre réponse. Merci.

En sortie sur le fichier récapitulatif (sur le site) j'ai:
J'attends votre réponse. Merci.

:?

Re: htmlentities, htmlspecialchars et ASCII.

par xTG » 27 nov. 2014, 19:05

As-tu essayé de réinsérer des données ?
En effet les données déjà présentes ne sont absolument pas convertis en UTF-8 via cette manipulation.

Re: htmlentities, htmlspecialchars et ASCII.

par niconicochan » 27 nov. 2014, 16:23

A propos de mon SGBD, j'ai écrit en SQL dans l'interface de phpmyadmin:

=> pour la bdd
ALTER DATABASE nomdemabase CHARACTER SET UTF8;
=> pour la table
ALTER TABLE nomdematable CHARACTER SET UTF8;
/
ALTER TABLE nomdematable CONVERT TO CHARACTER SET UTF8;
J'obtiens dans mon SGBD dans information => statistiques : utf8_general_ci
=> pour les champs
fait manuellement via l'interface.
Si je clique sur structure (de ma table) j'ai bien utf8_general_ci pour chaque champs de la colonne Interclassement.
2ème vérification:
Si j'écris en SQL:
SHOW FULL COLUMNS FROM nomdematable;
j'ai bien utf8_general_ci pour chaque champs dans la colonne collation.

Je crois pourtant avoir fait le tour :roll:

Verriez-vous autre chose qui puisse poser problème?

Re: htmlentities, htmlspecialchars et ASCII.

par xTG » 27 nov. 2014, 15:29

Les champs de ta tables doivent aussi être en UTF-8. :)

Re: htmlentities, htmlspecialchars et ASCII.

par niconicochan » 27 nov. 2014, 15:21

Mais attend, je te donne une information qui me semble importante.


Ce que je vois dans ma table sur phpmyadmin c'est:
Merci d'avance pour votre réponse.

Merci d'avance pour votre réponse.
en est assez proche, non?
L'espèce de sourcil qu'on retrouve en espagnol s'appelle bien un tilde dans la langue française et après on a bien le signe de copy.

Dois-je à ton avis essayer plutôt de changer é en é dans ma table pour résoudre mon problème?

Re: htmlentities, htmlspecialchars et ASCII.

par niconicochan » 27 nov. 2014, 15:09

Avec en plus:
mysqli_query($connexion, "SET NAMES 'utf8'");
devant ma requête, le navigateur me sort:
Merci d'avance pour votre réponse.

Au lieu de:
Merci d'avance pour votre réponse.

Par contre
mysqli_query($connexion, "SET NAMES 'utf-8'");
donne aussi:
Merci d'avance pour votre réponse.

Le navigateur réagit :D
Mais avec htmlspecialchars comme avec htmlentities
le é n'apparaît pas :(

Re: htmlentities, htmlspecialchars et ASCII.

par Genova » 27 nov. 2014, 13:18

Ah les joies de l'UTF-8.

Dans un premier temps sache que le fait d'encoder tes fichiers PHP en UTF-8 n'a aucun impact sur ce que tes utilisateurs entrent. Le seul intérêt d'encoder tes fichiers en UTF-8, c'est si ces derniers contiennent du texte en dur avec des accents.

Autrement pour gérer l'UTF-8 il faut que ce soit géré du coté base de donnée, et que tu mettes le charset de ta page en UTF-8. Visiblement tu as bien géré pour le charset, donc maintenant vérifie aussi au niveau de ta base de donnée. Il faut que tes champs textes dans tes tables soient en interclassement "utf8_general_ci".
Il faut aussi que tu lances cette requete SQL au début de tes scripts (tu le fais juste après ta connexion à la base de donnée) :
SET NAMES 'utf8'
Pour finir, htmlspecialchars() sera amplement suffisant pour te protéger des failles XSS à l'affichage. Oublie htmlentities(). Et oublie aussi les mb_convert_encoding() qui sont plus source de problème qu'autre chose ;)

htmlentities, htmlspecialchars et ASCII.

par niconicochan » 27 nov. 2014, 12:15

Bonjour,

Voilà le problème que je rencontre:
J'ai un formulaire suivi d'une feuille qui récapitule les données entrées dans le formulaire.
Cette deuxième feuille permet à l'utilisateur de vérifier ce qu'il vient d'entrer dans le formulaire et d'effectuer les modifications
nécessaires s'il y a besoin.

Un problème survient avec l'utilisation de htmlentities et htmlspecialchars.
Je m'explique:

J'ai un champs pour les commentaires dans mon formulaire. Si par exemple, en tant qu'utilisateur, j'écris
Merci d'avance pour votre réponse.

Dans le fichier récapitulatif, le réaffichage sera
Merci d'avance pour votre réponse.
si j'utilise htmlentities ou htmlspecialchars comme ceci (dans mon fichier de récapitulation):
<textarea rows="4" cols="100" name="recapitulation_commentaires" maxlength="2000"><?php echo htmlentities($commentaires, ENT_QUOTES, 'UTF-8'); ?></textarea>
Le réaffichage est:
Merci d'avance pour votre réponse.
si j'écris simplement
<textarea rows="4" cols="100" name="recapitulation_commentaires" maxlength="2000"><?php echo $commentaires; ?></textarea>
Ce que je voudrais faire, c'est assurer une protection contre les injections xss avec des fonctions comme
htmlentities ou htmlspecialchars, tout en assurant un réaffichage correct à l'écran.

Pour info,
<?php echo mb_detect_encoding($commentaires); ?>
et
<?php echo mb_detect_encoding(htmlentities($commentaires, ENT_QUOTES, 'UTF-8')); ?>
affichent tous deux à l'écran ASCII.
Il est en de même même si j'écris juste avant:
<?php utf8_encode($commentaires); ?>
Tous mes fichiers sont paramétrés en UTF-8 dans mon éditeur.

L'ajout de:
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> 
</head>
tout en haut du fichier de récapitulation n'y change rien.

L'ajout de
AddDefaultCharset UTF-8
tout en haut de mon fichier httpd.conf dans le fichier apache non plus
(même après avoir éteind puis rallumé mon panneau de configuration).

L'ajout de:
header('Content-Type: text/html; charset=UTF-8');
en haut de mon fichier de récapitulation ne change rien non plus.

Dans ma table toutes mes colonnes sont en utf8_general_ci dans Interclassement,
donc y compris celle des commentaires du formulaire.

Même
$commentaires=mb_convert_encoding($commentaires, 'UTF-8', 'ASCII');
, dans le fichier de récapitulation,
qui selon moi devrait permettre de passer à un jeu de caractères qui traduit les accents
ne fonctionne pas non plus.

Quelqu'un peut-il m'aider?