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.
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. –
@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
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. –