jeudi 1 avril 2010

Asp.net 3.5 - Recommandations d'usage pour l'upload de fichier avec Asp.NET

Quelques recommandations d’usage à vérifier lorsque l’on implémente une fonction d’upload :
Ici pour un fichier excel pour l'exemple :
-Validation de l’extension dans une liste blanche.
La méthode du framework .NET Path.GetExtension (http://msdn.microsoft.com/en-us/library/system.io.path.getextension.aspx) est utilisée pour extraire l’extension d’un fichier.
Il faudra ensuite vérifier que l’extension est présente dans une liste blanche :
Exemple de code
  List<String> ExtensionsOK = new List<String>();
            ExtensionsOK.Add(".xls");
            ExtensionsOK.Add(".XLS");
            ExtensionsOK.Add(".xlsx");
            ExtensionsOK.Add(".XLSX");
            String Extension =  Path.GetExtension(l_FileName) ;
            Boolean isExtensionOK = false ;
// Par defaut on ne fait pas confiance !
            foreach(String s in ExtensionsOK)
            {
              if(s.Equals(Extension))
                {
                            isExtensionOK = true ;
                            break ;
                 }
            }
            if( ! isExtensionOK )
                return;
ou pour ceux qui ne font pas confiance à cette méthode :
if (!Regex.IsMatch(l_FileName, @"\A(?:.*(.xls|.XLS|.xlsx|.XLSX)$)\Z", RegexOptions.Singleline))
return;
-Contrôler le ContentType du fichier
//application/vnd.ms-excel : excel
//application/vnd.openxmlformats-officedocument.spreadsheetml.sheet : excel 2007
if (!"application/vnd.ms-excel".Equals(FileUploader.PostedFile.ContentType) &&
                !"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet".Equals(FileUploader.PostedFile.ContentType))
            {
… // Refus
}
-La taille du fichier
if (FileUploader.PostedFile.ContentLength > int.Parse(ConfigurationManager.AppSettings["ImportExcelMaxSize"]))
{
}
-Rendre le dossier de dépose non exécutable au sens .NET.
On utilise pour cela un StaticFileHandler.
Les fichiers dans cette localisation ne seront pas interprétés par le moteur .NET.
<httpHandlers>
     <add verb="*" path="*" type="System.Web.StaticFileHandler"/>
</httpHandlers>
 
-Le mieux étant que le dossier d’upload soit en dehors du serveur Web
Ainsi les fichiers sont totalement inaccessibles.
Un composant  pour le téléchargement sera utilisé pour accéder aux documents et contrôlera le droit de l’utilisateur à télécharger tel ou tel fichier.
 
-Renommer les fichiers avec des GUID (http://msdn.microsoft.com/fr-fr/library/system.guid.aspx)
Ceci permet de rendre totalement non prédictible le nom de fichier.
Il sera ainsi extrêmement difficile de le récupérer sans passer par les contrôles standards.

Aucun commentaire:

Enregistrer un commentaire