2016-04-04 20 views
0

Ich schreibe ein natives Modul in C++ für IIS7/8, das Datei-Uploads ablehnen soll, die mit spezifischen Erweiterungen in IIS eingehen.Parsen Sie die Inhaltsdispositionsfelder eines Multi-Form-Mime-Typs

Ich habe das Modul mit OnReadEntity funktioniert und kann den Anfragetext auf der Post Anfrage hochladen die Dateien sehen.

Da ich jedoch mit C++ ziemlich unerfahren bin, habe ich keine Ahnung, wie ich die Content-Disposition Fields aus dem Anfragetext zuverlässig auslesen soll, damit ich alle Dateinamen bekommen kann.

Unten ist ein Beispiel Anfrage:

------WebKitFormBoundaryUomVPwKHGvBwvDhP 
Content-Disposition: form-data; name="attach1"; filename="YSMIsapiFilter.sln" 
Content-Type: text/plain 

SomeDataHere 

------WebKitFormBoundaryUomVPwKHGvBwvDhP 
Content-Disposition: form-data; name="attach2"; filename="ysmISAPIFilter.log" 
Content-Type: application/octet-stream 

I AM A LOG 
------WebKitFormBoundaryUomVPwKHGvBwvDhP 
Content-Disposition: form-data; name="enter_a_number" 


------WebKitFormBoundaryUomVPwKHGvBwvDhP-- 
ol: max-age=0 
Connection: keep-alive 
Accept:  text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 
Cookie: ASPSESSIONIDSSSRCTRS=GHMFFGABJAAOAEHFCFIOOJIO 
Host: localhost:8080 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like       Gecko) Chrome/49.0.2623.110 Safari/537.36 
Upgrade-Insecure-Requests: 1 

Weiß jemand, ob es etwas in der httpserv.h API ist dies bereits für mich zu tun. Oder wenn es einen kostenlosen, nicht-kommerziellen Mime-Typ-Parser gibt, der das in Visual Studio 2015 erstellt.

Oder würde ich es selbst analysieren müssen.

Von dem, was ich sammeln kann, sollte Content-Disposition und Content-Typ immer die 2. und 3. Zeile nach einer Zeile sein, die mit ------ beginnt, die WebkitformBoundary unterscheidet sich ausstehende den Client den Post (IE, Chrome, FireFox, etc usw.). Dann müsste ich einfach zum nächsten überspringen ------ wenn es einen gibt.

Content-Disposition über die RFC-Spezifikation besagt, dass es sich immer um Formulardaten handelt; gefolgt von dem Namen des Formularfelds "attach1", und dann alle Daten, die mit dieser Eingabe "Dateiname" bei einer Eingabe vom Typ "Datei" gehen.

Nur auf der Suche nach Punkten in die richtige Richtung.

Ich habe bereits versucht Mimetic zu verwenden, aber ich konnte es nicht erstellen, wenn ich seinen Header zu meinem Projekt hinzufüge. Das Win32-Projekt, mit dem es kommt, baut, aber es wird nicht in meinem bauen.

Antwort

0

Ich konnte dieses Problem lösen, indem ich die CLR mit C++ mischte und mein natives Http-Modul zu einer DLL mit gemischten Modi machte. Es ist also eine native DLL, die die .Net-CLR verwendet.

Dann mit Modul Voraussetzungen eingestellt I das Modul nur dann ausgeführt, wenn das NET CLR geladen und Bitness ist 32.

.NET aktiviert konnte ich einen Verweis auf System.Net.Http.Formatting hinzuzufügen mit einer integrierten MimeType Parser-Bibliothek.

Mit diesem konnte ich den Mime-Typ leicht parsen, der Post Requests in Begin Request in meinem nativen Http-Modul, Zugriff auf die FileName Felder bei Datei-Uploads, die ich dann verwendet, um die Anfrage abgelehnt, wenn die Dateinamen sind blockierte Erweiterungen und werfen einen benutzerdefinierten 500 internen Serverfehler.

Ein Nachteil, den ich gefunden habe, ist, dass manchmal die Entity Body Anfrage nicht mit einem neuen Zeilenzeichen endete und das bricht die .Net Mime Parsing Bibliothek, was einen Fehler verursacht. Also prüfe ich den Puffer, nachdem ich den Request Entity Body gelesen habe, um festzustellen, ob das letzte Zeichen ein neues Zeilenzeichen ist. Wenn nicht, füge ich einen hinzu, indem ich ihn in meinen .Net Memory Stream lege im .Net Mime Type Parser.