web-dev-qa-db-fra.com

désinfecter le nom du fichier joint

Je cherche un moyen de nettoyer le nom de fichier des pièces jointes téléchargées par l'utilisateur.

Je pensais que WordPress l’avait déjà fait, mais j’ai rencontré des problèmes après qu’un utilisateur ait téléchargé une pièce jointe contenant un "°". Ainsi, la pièce jointe n'est pas téléchargeable.

J'ai découvert cette fonction wp:

sanitize_file_name($filename)

est-il possible de l'utiliser à l'intérieur du

add_attachment

action?

merci

2
Dalen

Regardez comment je l'ai fait dans mon plugin URL Germanix . J'accroche dans 'sanitize_file_name', convertis ce dont j'ai besoin et enlève tout le reste. De cette façon, le fichier passe mais le nom du fichier est valide.

Je pense que c'est la meilleure expérience utilisateur possible: aucune donnée n'est perdue et aucun temps, et aucun message d'erreur irritant n'apparaît.

2
fuxia

Suite aux commentaires de la question.

Vous pouvez exécuter un filtre sur sanitize_file_name_chars et ajouter le symbole de degré au tableau de caractères non valides, mais cela n'arrêtera pas le téléchargement, il supprimera simplement l'extension du fichier.

Cependant, vous pouvez ajouter un autre filtre pour arrêter le téléchargement, de manière très astucieuse, en ajoutant en plus le filtre sanitize_file_name qui apparaît peu de temps après celui ci-dessus, vous voyez si une extension de fichier est présente, sinon vous savez qu'il y a eu un hit le tableau de caractères non valide et vous pouvez die() à l'intérieur du filtre, ce qui entraînera le processus de téléchargement pour renvoyer une erreur HTTP (ce qui est mieux que de mourir en silence, je suppose).

add_filter( 'sanitize_file_name_chars', 'restrict_filename_chars' );

function restrict_filename_chars( $special_chars ) {
    $special_chars = array_merge( array( '°' ), $special_chars );
    return $special_chars;
}

add_filter( 'sanitize_file_name', 'die_on_no_ext' );

function die_on_no_ext( $filename ) {
    global $parts;
    if( $parts < 2 )
        die(-1);
    return $filename;
}

Ce n’est pas une solution idéale, mais nous verrons ce qui se passe avec le ticket (il se peut que je manque quelque chose, je ne suis pas un expert en validation de dossier).

REMARQUE: Le filtre garantit uniquement que le nom de fichier actuel ne contient pas le symbole de degré, ni le "nom du message" (c'est-à-dire le titre de la pièce jointe). , vous aurez besoin d’un autre filtre pour assainir le titre des pièces jointes, qui est géré par différentes fonctions et filtres.

2
t31os