Je cherche un moyen simple d'obtenir un type MIME où l'extension de fichier est incorrecte ou non donnée, quelque chose de similaire à cette question uniquement dans .Net.
c#
mime
mime-types
Richard Gourlay
la source
la source
Réponses:
Dans Urlmon.dll, il existe une fonction appelée
FindMimeFromData
.De la documentation
Alors, lisez les premiers (jusqu'à) 256 octets du fichier et passez-le à
FindMimeFromData
.la source
J'ai finalement utilisé urlmon.dll. Je pensais qu'il y aurait un moyen plus simple mais cela fonctionne. J'inclus le code pour aider quelqu'un d'autre et me permettre de le retrouver si j'en ai besoin.
...
la source
J'ai trouvé une solution codée en dur, j'espère que j'aiderai quelqu'un:
la source
StringComparer.OrdinalIgnoreCase
le constructeur du dictionnaire. La comparaison ordinale est plus rapide qu'invariante, et vous vous débarrasserez de.ToLower()
ses variations.Edit: Utilisez simplement Mime Detective
J'utilise des séquences de tableaux d'octets pour déterminer le type MIME correct d'un fichier donné. L'avantage de cela sur la simple recherche de l'extension de fichier du nom de fichier est que si un utilisateur devait renommer un fichier pour contourner certaines restrictions de téléchargement de type de fichier, l'extension de nom de fichier ne parviendrait pas à le détecter. D'un autre côté, obtenir la signature du fichier via un tableau d'octets empêchera ce comportement malicieux de se produire.
Voici un exemple en C #:
Remarquez que j'ai traité les types de fichiers DOCX différemment, car DOCX n'est en fait qu'un fichier ZIP. Dans ce scénario, je vérifie simplement l'extension du fichier une fois que j'ai vérifié qu'il a cette séquence. Cet exemple est loin d'être complet pour certaines personnes, mais vous pouvez facilement ajouter le vôtre.
Si vous souhaitez ajouter plus de types MIME, vous pouvez obtenir ici les séquences de tableaux d'octets de nombreux types de fichiers différents . En outre, voici une autre bonne ressource concernant les signatures de fichiers.
Ce que je fais souvent si tout le reste échoue, c'est parcourir plusieurs fichiers d'un type particulier que je recherche et rechercher un modèle dans la séquence d'octets des fichiers. En fin de compte, il s'agit toujours d'une vérification de base et ne peut pas être utilisé pour une preuve à 100% de la détermination des types de fichiers.
la source
Si vous utilisez .NET Framework 4.5 ou supérieur, il existe désormais une méthode MimeMapping.GetMimeMapping (nom de fichier) qui retournera une chaîne avec le mappage Mime correct pour le nom de fichier transmis. Notez que cela utilise l'extension de fichier, pas les données du fichier lui-même.
La documentation est à http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping
la source
var mimetype = System.Web.MimeMapping.GetMimeMapping(<pathToFile>);
Vous pouvez également consulter le registre.
D'une manière ou d'une autre, vous devrez exploiter une base de données de MIME - qu'ils soient mappés à partir d'extensions ou de nombres magiques est quelque peu trivial - le registre Windows est un tel endroit. Pour une solution indépendante de la plate-forme, il faudrait cependant expédier cette base de données avec le code (ou en tant que bibliothèque autonome).
la source
J'utilise une solution hybride:
la source
.doc
fichier.HeyRed.Mime.MimeGuesser.GuessMimeType
de Nuget serait la solution ultime si vous souhaitez héberger votre solution ASP.NET sur des environnements non Windows.Le mappage d'extension de fichier est très peu sûr. Si un attaquant téléchargeait des extensions invalides, un dictionnaire de mappage permettrait par exemple de distribuer les exécutables dans des fichiers .jpg. Par conséquent, utilisez toujours une bibliothèque de détection de contenu pour connaître le véritable type de contenu.
la source
Je pense que la bonne réponse est une combinaison des réponses de Steve Morgan et de Serguei. Voilà comment Internet Explorer le fait. L'appel pinvoke ne
FindMimeFromData
fonctionne que pour 26 types de mime codés en dur. En outre, il donnera des types de mime ambigus (tels quetext/plain
ouapplication/octet-stream
) même s'il peut exister un type de mime plus spécifique et plus approprié. S'il ne parvient pas à donner un bon type MIME, vous pouvez aller dans le Registre pour un type MIME plus spécifique. Le registre du serveur pourrait avoir plus de types MIME à jour.Reportez-vous à: http://msdn.microsoft.com/en-us/library/ms775147(VS.85).aspx
la source
Cette classe utilise les réponses précédentes pour essayer de 3 manières différentes: codé en fonction de l'extension, FindMimeFromData API et en utilisant le registre.
la source
J'ai trouvé celui-ci utile. Pour les développeurs VB.NET:
la source
Je suis tombé sur le même problème et j'ai finalement opté pour ma propre saveur de la solution de Kirk Baucom, trouvée ici .
Il me semble que c'est l'occasion pour quelqu'un d'écrire un service de recherche en ligne.
Quoi qu'il en soit, j'espère que cela aide.
la source
Si quelqu'un le voulait, il pourrait porter l'excellent module perl File :: Type vers .NET. Dans le code se trouve un ensemble de recherches de nombre magique d'en-tête de fichier pour chaque type de fichier ou correspond à une expression régulière.
Voici une bibliothèque de détection de type de fichier .NET http://filetypedetective.codeplex.com/ mais elle ne détecte qu'un petit nombre de fichiers pour le moment.
la source
Cette réponse est une copie de la réponse de l'auteur (Richard Gourlay), mais améliorée pour résoudre les problèmes sur IIS 8 / win2012 (où la fonction entraînerait le plantage du pool d'applications), basée sur le commentaire de Rohland pointant vers http://www.pinvoke.net /default.aspx/urlmon.findmimefromdata
...
la source
@Steve Morgan et @Richard Gourlay c'est une excellente solution, merci pour cela. Un petit inconvénient est que lorsque le nombre d'octets dans un fichier est égal ou inférieur à 255, le type MIME donne parfois "application / octet-stream", ce qui est légèrement inexact pour les fichiers qui devraient produire "text / plain". J'ai mis à jour votre méthode d'origine pour tenir compte de cette situation comme suit:
Si le nombre d'octets dans le fichier est inférieur ou égal à 255 et que le type de mime déduit est "application / octet-stream", créez un nouveau tableau d'octets qui se compose des octets du fichier d'origine répétés n fois jusqu'au nombre total d'octets est> = 256. Ensuite, revérifiez le type MIME sur ce nouveau tableau d'octets.
Méthode modifiée:
la source
IIS 7 ou plus
Utilisez ce code, mais vous devez être l'administrateur du serveur
la source
Lorsque vous travaillez avec un rôle Web Windows Azure ou tout autre hôte qui exécute votre application en confiance limitée, n'oubliez pas que vous ne serez pas autorisé à accéder au registre ou au code non managé. Approche hybride - la combinaison de try-catch-for-registry et du dictionnaire en mémoire ressemble à une bonne solution qui a un peu de tout.
J'utilise ce code pour le faire:
la source
J'ai fini par utiliser Winista MimeDetector de Netomatix. Les sources peuvent être téléchargées gratuitement après avoir créé un compte: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx
Cela fait partie d'une autre question répondue ici: Alternative à la méthode FindMimeFromData dans Urlmon.dll, qui a plus de types MIME La meilleure solution à ce problème à mon avis.
la source
J'ai trouvé plusieurs problèmes lors de l'exécution de ce code:
Si vous essayez de l'exécuter avec x64 / Win10, vous obtiendrez
Merci à ce post PtrToStringUni ne fonctionne pas dans Windows 10 et @xanatos
J'ai modifié ma solution pour qu'elle fonctionne sous x64 et .NET Core 2.1:
Merci
la source
Bonjour, j'ai adapté le projet Winista.MimeDetect en .net core / framework avec repli en urlmon.dll N'hésitez pas à l'utiliser: package nuget .
la source
mimeTypes.GetMimeTypeFromFile(bytes);
J'ai écrit un validateur de type mime. Veuillez le partager avec vous.
la source