2016-04-04 7 views
0

IIS7/8用のネイティブモジュールを、特定の拡張子を持つIISに入ってくるファイルのアップロードを拒否する目的でC++で作成しています。マルチフォームMIMEタイプのコンテンツ処理フィールドを解析する

私はOnReadEntityを使用してモジュールを稼働させ、ファイルをアップロードする投稿要求に対して要求の本文を見ることができます。

しかし、C++には慣れていないので、どのようにファイル名をすべて取得できるように、要求本文からContent-Dispositionフィールドを確実に解析すると思いますか。以下は

例要求です:すでに私のためにこれを行うにはhttpserv.h APIの何かがある場合

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

誰もが知っています。または、Visual Studio 2015でビルドするこれを行う非営利のMIMEタイプのパーサーが無料である場合。

それとも、自分で解析する必要がありますか。

------で始まる行の後に、Content-Dispositionとcontent-typeは常に2行目と3行目でなければなりません。webkitformBoundaryは、 Chrome、FireFoxなど)が含まれます。それから私はちょうど次のものにスキップする必要があります。

Content-Dispositionは、RFC仕様では常にフォームデータとなります。続いてフォームフィールド "attach1"の名前が続き、タイプ "file"の入力の場合はその入力 "filename"と一緒に移動するデータが続きます。

ちょうどこの方向の正しい方向の点を探しています。

私は既にMimeticを使ってみましたが、プロジェクトにヘッダーを追加するとビルドできませんでした。それに付属のWin32プロジェクトはビルドされていますが、私のビルドには組み込まれません。

答えて

0

私はCLRをC++と混合し、ネイティブHttpモジュールを混合モードのDLLにすることでこの問題を解決できました。したがって、.Net CLRを使用するネイティブDLLです。

次に使用して、モジュールの前提条件は、私は、.NET CLRがロードされている場合のみにモジュールが実行する設定とbit化は.NETとの32

私はSystem.Net.Http.Formattingへの参照を追加することができました有効になっていますMimeType Parserライブラリが組み込まれています。

これを使用して、私のネイティブHttpモジュールのBegin RequestのPost Requestsに入ってきたMimeタイプを簡単に解析できました。ファイルアップロードのfileNameフィールドにアクセスできました。ファイル名はブロックされた拡張子で、カスタム500の内部サーバーエラーがスローされます。

Entity Bodyリクエストが改行文字で終わらず、.Net Mime Parsingライブラリが破損し、エラーが発生することがあります。だから私は、最後の文字が新しい行の文字であるかどうかを判断するためにリクエストエンティティボディを読み込んだ後にバッファをチェックします。使用するために生のバッファを挿入した後に.Netメモリストリームにバッファを追加します。 .Net Mimeタイプのパーサーで。

関連する問題