2016-04-04 7 views
0

Я пишу собственный модуль на C++ для IIS7/8, целью которого является отклонение загрузки файлов, поступающих в IIS с определенными расширениями.Проанализируйте поля сложения содержимого многоформатного типа Mime

Я получил модуль, работающий с использованием OnReadEntity, и вы можете увидеть тело запроса при отправке файлов после отправки.

Однако, будучи довольно неопытным с C++, я понятия не имею, как я могу надежно проанализировать поля Content-Disposition из тела запроса, чтобы я мог получить все имена файлов.

Ниже приведен пример запрос:

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

Кто-нибудь знает, если есть что-то в httpserv.h API, чтобы сделать это для меня уже. Или, если для этого требуется бесплатный парсер безрецептурного типа, создающий Visual Studio 2015.

Или мне нужно было бы самому разобрать его.

Из того, что я могу собрать, Content-Disposition и content-type всегда должны быть 2-й и 3-й строками после строки, начинающейся с ------, Chrome, FireFox и т. Д. И т. Д.). Тогда мне просто нужно было перейти к следующему ------ если он есть.

Content-Disposition через спецификацию RFC утверждает, что это всегда будут данные формы; за которым следует имя поля формы «attach1», а затем любые данные, которые идут с этим вводом «имя файла» в случае ввода типа «файл».

Просто ищите точки в правильном направлении на этом.

Я уже пробовал использовать Mimetic, но я не мог его построить, когда добавляю заголовок в свой проект. Проект Win32 поставляется с сборками, но он не будет построен на моем.

ответ

0

Я смог решить эту проблему, смешав CLR с C++ и сделав модуль Native Http DLL с смешанным режимом. Так что это родная DLL, которая использует .Net CLR.

Затем с помощью модуля предусловий я поставил модуль только работать, если загружен .Net CLR и битностью 32.

С .Net Enabled я был в состоянии добавить ссылку на System.Net.Http.Formatting , который имеет встроенную библиотеку MimeType Parser.

Используя это, я смог легко проанализировать тип Mime, входящий в Post Requests в Begin Request в моем Native Http Module, предоставив мне доступ к полям fileName при загрузке файлов, которые я тогда использовал, чтобы отклонить запрос, если filename - заблокированные расширения и генерируют пользовательскую ошибку внутреннего сервера 500.

Одно из предостережений, которое я обнаружил, заключается в том, что иногда запрос Body Entity не заканчивался новым символом линии, и он разбивает библиотеку .Net Mime Parsing, вызывая ошибку. Поэтому я проверяю буфер после того, как я прочитал Тело сущности запроса, чтобы определить, является ли последний символ новым символом строки, если я не добавляю его в буфер, добавив его в мой .Net-поток памяти после заполнения его необработанным буфером для использования в .Net Mime Type Parser.

 Смежные вопросы

  • Нет связанных вопросов^_^