2009-10-05 19 views
3

Je comprends la nécessité d'assainir les entrées d'un formulaire HTML, mais quand j'ai assaini le champ de téléchargement de fichier dans un de mes modules récents, le téléchargement du fichier a commencé à échouer. Il est important d'assainir toutes les entrées de formulaire, non? Même le champ de téléchargement de fichier spécial?Dois-je nettoyer le champ de saisie de téléchargement de fichier dans mon formulaire HTML Perl CGI?

Ma forme de code de sortie ressemble à ceci:

use CGI; 
my $cgi = new CGI; 
print $cgi->header(); 
# ... print some HTML here 
print $cgi->start_form(); 
print $cgi->filefield(-name=>'uploaded_file', 
         -size=>50, 
         -maxlength=>80); 
print $cgi->submit(-name=>'continue', 
        -value=>'Continue'); 
print $cgi->end_form(); 
# ... print some more HTML here 

Et mon code sanitization ressemble à quelque chose comme ça (il est en fait plus tôt dans le même module que ci-dessus):

use HTML::Entities 
my $OK_CHARS => 'a-zA-Z0-9 .,-_'; 
foreach my $param_name ($cgi->param()) { 
    my $original_content = $cgi->param($param_name); 
    my $replaced_content = HTML::Entities::decode($original_content); 
    $replaced_content =~ s/[^$OK_CHARS]//go; 
    $cgi->param($param_name, $replaced_content); 
} 

Quand j'ajouté le code de nettoyage récemment, le téléchargement du fichier a commencé à échouer. Le descripteur de fichier est maintenant en renvoyant undefined cette ligne:

my $uploadedFilehandle = $cgi->upload('uploaded_file'); 

Alors ai-je fait quelque chose de mal dans le code aseptisation? J'ai reçu cet extrait de code quelque part sur Internet, donc je ne comprends pas tout à fait. Je n'ai jamais vu de modificateur de regex 'o' auparavant et je n'ai jamais utilisé le module HTML :: Entities auparavant.

Répondre

3

Les entités ne sont pas codées dans le contenu des téléchargements de fichiers. La désinfection d'un fichier téléchargé n'est pas la même chose que la désinfection d'un champ de texte. Avec un téléchargement de fichier, vous vérifiez l'extension et éventuellement le format et l'encodage (en essayant de l'ouvrir en utilisant un décodeur particulier, etc.) et assurez-vous que le fichier n'est pas trop volumineux.

Dans votre code, vous essayez en fait d'effectuer des opérations de chaîne sur un descripteur de fichier lorsque vous cliquez sur le champ de fichier.

+0

Oups. Je n'ai pas vraiment réalisé param ('uploaded_file') retourné un handle de fichier. Je savais que upload ('uploaded_file') renvoyait un handle de fichier. Tous les tutoriels de désinfection que j'ai trouvés n'ont pas mentionné cette petite complication. –

+0

@Kurt: Ce n'est pas toujours un handle de fichier. De CGI.pm: Lorsque le formulaire est traité, vous pouvez récupérer le nom de fichier entré en appelant param(): $ filename = $ query-> param ('uploaded_file'); Différents navigateurs renvoient des choses légèrement différentes pour le nom. Certains navigateurs renvoient uniquement le nom de fichier. Autres renvoient le chemin d'accès complet au fichier ... Le nom de fichier retourné est également un descripteur de fichier. Vous devriez pouvoir le traiter comme une chaîne, bien que je sois d'accord qu'il est plus facile d'utiliser simplement la méthode upload(). – jimtut

+0

Merci pour l'explication. Je vérifie déjà ailleurs dans le code que le fichier téléchargé est le bon type que je m'attends, donc je passerai simplement la désinfection du champ de téléchargement dans la routine de désinfection. –

2

Non, vous ne devriez pas. Voir la CGI.pm docs sur la façon de traiter un champ de téléchargement:

Pour être sûr, utilisez la fonction upload() (nouvelle version 2.47). Lorsqu'il est appelé avec le nom d'un champ de téléchargement, upload() renvoie un objet de type filehandle ou undef si le paramètre n'est pas un descripteur de fichier valide. ...