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