1

我正在用 C++ 为 IIS7/8 编写本机模块,其目的是拒绝文件上传进入具有特定扩展名的 IIS。

我已经使用 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 中构建了一个免费的非商业 mime 类型解析器来执行此操作。

或者我需要自己解析它。

据我所知,Content-Disposition 和 content-type 应该始终是以 ------ 开头的行之后的第 2 行和第 3 行,webkitformBoundary 在客户端发帖(IE、Chrome、FireFox、等等等等)。然后我只需要跳到下一个-----如果有的话。

Content-Disposition 通过 RFC 规范声明它将始终是表单数据;后跟表单字段“attach1”的名称,然后是“文件”类型输入的情况下与该输入“文件名”相关的任何数据。

只是在这一点上寻找正确方向的点。

我已经尝试过使用 Mimetic,但是当我将它的标题添加到我的项目时,我无法构建它。它附带的 Win32 项目构建,但它不会构建在我的。

4

1 回答 1

1

我能够通过将 CLR 与 C++ 混合并使我的 Native Http 模块成为混合模式 DLL 来解决这个问题。所以它是一个使用 .Net CLR 的本机 DLL。

然后使用模块前置条件,我将模块设置为仅在加载 .Net CLR 并且位数为 32 时运行。

启用 .Net 后,我​​能够添加对 System.Net.Http.Formatting 的引用,它具有内置的 MimeType Parser 库。

使用它,我可以轻松地解析在我的本机 Http 模块中的开始请求中的 Post Requests 中进入的 Mime 类型,让我可以访问文件上传时的 fileName 字段,然后如果文件名被阻止扩展名,我会使用它来拒绝请求并抛出自定义 500 内部服务器错误。

我发现的一个警告是,有时实体主体请求没有以换行符结尾,这会破坏 .Net Mime Parsing 库,从而导致错误。因此,我在读取请求实体主体后检查缓冲区以确定最后一个字符是否是换行符,如果不是,则在使用原始缓冲区填充缓冲区以供使用后,通过将其附加到我的 .Net 内存流中,将其添加到缓冲区中在 .Net Mime 类型解析器中。

于 2016-04-29T07:56:14.030 回答