IIS请求内容筛选是否在筛选之前加载完整请求

IIS请求内容筛选是否在筛选之前加载完整请求,iis,filtering,Iis,Filtering,我正在按内容长度进行调查。我已设置了允许的最大内容长度: appcmd set config /section:requestfiltering /requestlimits.maxallowedcontentlength:30000000 我的问题是关于过滤器何时出现 IIS是首先将所有请求读取到内存中,然后抛出错误,还是在达到阈值后立即引发问题?IIS请求过滤模块在请求管道中很早就被处理。不需要的请求在进入速度较慢且攻击面更大的应用程序代码之前会被迅速丢弃。出于这个原因,一些人报告说,在实

我正在按内容长度进行调查。我已设置了允许的最大内容长度:

appcmd set config /section:requestfiltering /requestlimits.maxallowedcontentlength:30000000
我的问题是关于过滤器何时出现


IIS是首先将所有请求读取到内存中,然后抛出错误,还是在达到阈值后立即引发问题?

IIS请求过滤模块在请求管道中很早就被处理。不需要的请求在进入速度较慢且攻击面更大的应用程序代码之前会被迅速丢弃。出于这个原因,一些人报告说,在实施请求过滤设置后,性能有所提高

局限性 请求筛选限制包括以下内容:

  • 无状态-请求筛选不知道应用程序或会话状态。无论会话是否已建立,每个请求都会单独处理
  • 仅请求标头-请求筛选只能检查请求标头。它对请求主体或响应的任何部分都没有可见性
  • 基本逻辑-正则表达式和通配符匹配不可用。大多数设置包括建立大小约束,而其他设置则执行简单的字符串匹配
最大允许长度 请求筛选检查
内容长度
请求头的值。如果该值超过为
maxAllowedContentLength
设置的值,则客户端将收到HTTP
404.13

建议的值为30000000或更小

IISRFBaseline 以上信息基于我的PowerShell模块。它利用Microsoft Logparser扫描网站的内容目录和IIS日志,帮助建立IIS请求筛选基线

许多设置都有一个专用的标记文件,提供有关设置的更多信息。可在以下位置找到
maxAllowedContentLength
的一个:

更新-@johny-5评论 过滤会立即发生,这是有意义的,因为请求过滤只能看到请求头。这通过以下方法得到确认:

  • 请求跟踪失败-请求筛选模块使用HTTP
    413
    请求实体太大来响应请求
  • -接受请求并将其发送至IIS网站。紧接着是一个显示HTTP
    413
    响应的条目。两者之间的时间不足以完成上载
  • 数据包捕获-使用Microsoft Network Monitor,HTTP对话显示IIS立即响应HTTP
    413
    请求实体过大
你应该关心的是IIS仍然接受上传,不管文件大小如何。我发现限制因素是默认设置为120秒。如果文件在超时之前“完成”,则会显示HTTP
413
错误消息。发生超时时,浏览器会显示连接重置,因为在发送TCP ACK/RST后,IIS会破坏TCP连接

为了进一步测试这一点,超时被增加并设置为
connectionTimeout=6000
。然后提交了一个大型上载,并一次停止一个以下IIS组件。每次停止后,通过网络监视器检查上传并确认仍在运行

  • 应用程序池(
    停止WebAppPool-名称AppPoolName
  • 万维网发布服务(
    停止服务-名称W3SVC
  • 在这三个进程都停止后,我确认没有IIS进程仍在运行,但字节仍在上传。这使我得出结论,连接是由
    http.sys
    维护的。
    connectionTimeout
    http.sys
    密切相关的事实似乎支持这一点。我不知道上传的字节是进入缓冲区还是被丢弃。在这种情况下,报告没有提供任何帮助


    省略
    Content Length
    请求头将导致
    HTTP.sys
    生成的RFC协议错误(即HTTP
    400
    错误请求),因为HTTP有效负载的大小没有被声明。

    请求字节由HTTP.sys从线路读取,然后传递到w3wp.exe。请求过滤发生在w3wp.exe内部。因此,请求一直都在内存中,而不是隐藏在其他地方。@LexLi,如果您正在发送一个大文件,例如有人用一个2G的文件点击服务器,服务器会在进行筛选之前将整个文件读入内存,这会怎么样?是否有一种方法可以在加载到之前进行筛选memory@LexLi非常感谢,我会在这方面做更多的研究。如果你想把你的评论作为答案发表,我会把它标记为正确,因为它回答了问题。另外,如果您有任何简单的资源,我可以用它来验证这一点,我将非常感谢“使用2G文件访问服务器”不会生成一个2GB HTTP请求(如果您知道我的意思),而是一系列请求。因此,如果您的目标是防止这种情况发生,那么您需要在应用程序级别上进行。您可以尝试执行这样的上载(几MB应该可以),同时使用Wireshark等工具来分析实际的HTTP请求/响应。这将揭示引擎盖下到底是什么,然后你就可以进行实验了。IIS请求筛选仅对请求(或每个请求)有效,因此它将阻止大请求,但不会阻止通过一系列小请求传输的大文件。谢谢,我仍然不清楚何时进行筛选,例如,如果一个客户端正在上传一个2 gig的文件,而内容长度标题被省略,那么会发生什么occur@johnny-5更新了我对您评论的回答。有趣的发现是IIS10将继续接受上传。谢谢,我感觉http.sys仍然需要