38 votes

PHP échappe à la saisie de l'utilisateur pour le nom de fichier

J'ai un formulaire où les utilisateurs peuvent télécharger des fichiers, et j'aimerais nommer le fichier de la manière suivante [id]_[lastname]_[firstname].pdf . Le nom est saisi par l'utilisateur, et j'ai peur qu'il saisisse quelque chose avec une barre oblique. Sinon, quelque chose comme $path = $dir.$filename pourrait entraîner $path = 'uploads/2_smith_john/hahaimajerk.pdf' si le prénom est john/hahaimajerk .

Je ne veux pas vraiment forcer les utilisateurs à restreindre leur nom à quoi que ce soit ; cela ne me dérange pas de changer un peu leur nom dans le nom du fichier, tant que je peux retrouver le nom original. Quels caractères dois-je échapper, ou existe-t-il un autre moyen de le faire ? Ou... dois-je simplement utiliser mysql_real_escape_string ?

73voto

Tommy Lacroix Points 703

J'utilise généralement des expressions régulières pour cela. Et au lieu de supprimer certains caractères spécifiques (comme les barres obliques, les points, etc.), je préfère n'autoriser que certains caractères (comme les caractères alphanumériques)

Par exemple, cela remplacera tout caractère qui n'est pas une lettre, un chiffre, un tiret ou un trait de soulignement par un trait de soulignement :

$escaped = preg_replace('/[^A-Za-z0-9_\-]/', '_', $raw);

La barre oblique inversée qui précède le tiret permet d'échapper au tiret dans l'expression régulière, car les tirets sont autrement utilisés pour spécifier des plages de caractères (comme A-Z).

14voto

netcoder Points 31874

mysql_real_escape_string n'échappera pas aux barres obliques. Même escapeshellarg ne le fera pas. Vous devrez utiliser str_replace :

$path = str_replace('/', '_', $path);

3voto

Niet the Dark Absol Points 154811

Le seul caractère "non sûr" dans un nom de fichier est / - Vous pouvez donc facilement éviter les problèmes en utilisant str_replace("/","",$filename)

1voto

Alex N. Points 2612

Escapeshellarg est ce que vous recherchez :

http://us.php.net/manual/en/function.escapeshellarg.php

-2voto

memical Points 937

Escapeshellcmd peut aussi aider.

http://php.net/manual/en/function.escapeshellcmd.php

echo escapeshellcmd("\/()_") -> will display \\/\(\)_

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X