JeuWeb - Crée ton jeu par navigateur
htmlspecialchars et nom dossier - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : htmlspecialchars et nom dossier (/showthread.php?tid=7267)



htmlspecialchars et nom dossier - hercull - 04-12-2014

Bonjour à tous,

Lorsque l'utilisateur rempli une page de formulaire, il y a une zone de texte réserver au nom, pour sécuriser cette zone de texte j'utilise "htmlspecialchars($_POST['nom'], ENT_QUOTES)".

Seulement le résultat en base de donnée et différent du nom choisi par l'utilisateur si il contient des caractères spéciaux, jusque la pas de probleme.

Mais lorsque l'utilisateur valide son formulaire j'utilise "mkdir('images/'.$nom); " afin de créer un dossier qui aura le même nom que celui de l'utilisateur , et qui contiendra ces images.

Mon probleme intervient à l'affichage de l'image car en base de donnée le nom est par exemple : "Barrière" , le nom du dossier est "Barrière" mais il va chercher le nom d'origine dans le chemin du dossier et donc images/Barrière/nomimage.

Donc "Barrière" et "Barrière" sont différent , il ne trouve pas l'image.

Comment gérez vous ce problème d'encodage?

Cordialement.


RE: htmlspecialchars et nom dossier - Prélude - 04-12-2014

Regarde du coté des fonction d'encodage UTF-8 : utf8_encode et utf8_decode
Sinon, juste un conseil simple à mettre en œuvre : utilise plutôt l'id de l'utilisateur en base de donnée plutôt que son nom pour la création du dossier. Ou alors, vérifie bien toutes les possibilités du genre '../' ou autre...


RE: htmlspecialchars et nom dossier - Sha224 - 04-12-2014

Je te conseillerais aussi d'utiliser l'id de l'utilisateur pour créer tes dossiers, sinon tu risques d'avoir aussi des problèmes avec d'autres types de caractères (arabes, coréens, etc.) plus atypiques en production et il y a plus chouette que ça à déboguer. Et comme dis Prélude, il faudra faire très attention à ce que soumettent les utilisateurs pour éviter les hacks... Si maintenant c'est une question de référencement ou de faire une jolie url, tu pourrais faire un remplacement de tous les accents (è -> e, etc.), et si aucun caractère n'est convertissable (écriture en japonais, chinois, etc.) alors tu te sers de l'id.


RE: htmlspecialchars et nom dossier - julp - 05-12-2014

Ca ne sert strictement à rien htmlspecialchars sur un nom de fichier, ça n'a rien à voir avec les XSS.

Quant aux accents :
1. ça dépend de l'OS déjà (un nom de fichier en UTF-8 c'est impossible sous Windows avec les fonctions standard - sans passer par l'extension COM ou des extensions tierces comme php-wfio)
2. il faut reprendre strictement le même jeu (sinon forcément si les points de code >= 0x80 ne sont pas codés pareils, on ne risque pas de trouver le fichier)

C'est clair qu'il serait plus censé d'utiliser l'id, si vraiment on devait créer physiquement un répertoire, surtout si c'est la seule information réellement fixe (quid d'un changement de pseudo ?).


RE: htmlspecialchars et nom dossier - hercull - 05-12-2014

Merci c'est un très bonne idée d'utiliser l'id, je n'y avais pas penser, je l'ai fais et plus de probleme.


RE: htmlspecialchars et nom dossier - Xenos - 05-12-2014

Comme dit, htmlspecialchars() est totalement hors-sujet pour les noms de dossier (ne serait-ce que l'exemple du .. comme nom de dossier, que htmlspecialchars laissera joyeusement passer). Le principe d'utiliser l'ID est très pertinent.
Sinon, les noms de dossiers dépendent de l'architecture (type Linux, Windows, Unix) du serveur et de l'encodage de caractère.

Une autre solution est donnée sur stackoverflow: stocker le nom en BDD (classique) et utiliser son hash (md5) ou un encodage (base64) pour le nom réel du dossier. Utiliser une table type (`Id` AUTO_INCREMENT, `NomDossier`), en y stockant le nom du dossier et en utilisant son `Id` dans les chemins réel, est tout aussi acceptable; cela ajoute seulement une colonne Smile


RE: htmlspecialchars et nom dossier - Prélude - 06-12-2014

L'id est en général présent dans une table, donc, ça ne rajoute pas vraiment une colonne.
Et pour le md5, ne pas oublier qu'il est possible (mais peu probable... mais possible...) que 2 md5 soient similaires. Tout dépend de la quantité de dossier (en fait, non, tout dépend de la chance que l'on a, mais c'est une autre histoire).
Remarque, en y pensant bien, si la quantité est importante, il faudra certainement faire un petit hashage pour rajouter un niveau d'arborescence du genre : id modulo 10. Ce qui donnerait une arborescence du genre : 1/id 2/id ... Et éviterait d'avoir trop de sous dossiers au même niveau.


RE: htmlspecialchars et nom dossier - Xenos - 06-12-2014

Oui, le principe de faire plusieurs niveaux (dossiers/1/0/5/351 pour l'id 105351) est une solution également utilisée par DeviantArt. On peut l'appliquer aussi pour le md5 (dossier/0d/21/6c/ea/89a1e4453dcc29181f29116a pour le hash 0d216cea89a1e4453dcc29181f29116a).
Les cas de collisions sont extrêmement rares. On peut les éviter au niveau de la BDD (refuser un nom de dossier dont le MD5 existerait déjà).

L'id peut ne pas être directement utilisable suivant le degrés de sécurité que l'on souhaite (si on utilise directement l'ID du joueur comme nom de dossier, alors ceux qui ont accès au FTP connaissent les données de chaque joueur ainsi que son ID). Mais pour de l'indé ou du dev seul, c'est pas franchement problématique Wink
Suivant les données de ces dossiers, il faudra vérifier que la personne qui y accède via internet (htpp://.../dossiers/1/0/5/351) en a bien les droits. Le MD5 présente l'avantage d'éviter qu'un tiers ne devine trop facilement le chemin d'accès au dossier (à condition de saler le hash).