我正在按内容长度查看IIS Request filtering。我已经设置了允许的最大内容长度:
appcmd set config /section:requestfiltering /requestlimits.maxallowedcontentlength:30000000
我的问题是何时进行过滤。
IIS将首先将所有请求读入内存,然后引发错误,还是在达到阈值后立即引发问题?
答案 0 :(得分:1)
IIS请求筛选模块在请求管道中很早就得到了处理。不需要的请求会被快速丢弃,然后再继续执行速度较慢且攻击面更大的应用程序代码。因此,有些人报告说在实施请求过滤设置后性能会提高。
请求过滤限制包括以下内容:
请求过滤检查Content-Length
请求标头的值。如果该值超过为maxAllowedContentLength
设置的值,则客户端将收到HTTP 404.13
。
IIS 8.5 STIG的建议值是30000000或更少。
以上信息基于我的PowerShell模块IISRFBaseline。通过利用Microsoft Logparser扫描网站的内容目录和IIS日志,它可以帮助建立IIS请求筛选基准。
许多设置都有专用的markdown文件,提供有关该设置的更多信息。可以在以下位置找到maxAllowedContentLength
的一个:
https://github.com/phbits/IISRFBaseline/blob/master/IISRFBaseline-maxAllowedContentLength.md
过滤会立即进行,这很有意义,因为“请求过滤”仅对请求标头具有可见性。通过以下方法确认了这一点:
413
请求实体太大来响应请求。413
响应。间隔时间还不够长,无法完成上传。413
请求实体进行了响应。您应该正确考虑的部分是,无论文件大小如何,IIS仍会接受上载。我发现限制因素为connectionTimeout
,其默认设置为120秒。如果在超时之前文件已“完成”,则会显示HTTP 413
错误消息。发生超时时,浏览器将显示连接重置,因为在发送TCP ACK / RST之后IIS破坏了TCP连接。
要进一步测试,请增加超时并将其设置为connectionTimeout=6000
。然后提交大量上载,并且一次停止了以下IIS组件。每次停止后,通过网络监视器检查上载并确认其仍在运行。
Stop-WebAppPool -Name AppPoolName
)Stop-Service -Name W3SVC
)三个都停止了,我确认没有IIS进程仍在运行,但是字节仍在上载。这使我得出结论,该连接由http.sys
维护。 connectionTimeout
与http.sys
紧密相连的事实似乎支持了这一点。我不知道上传的字节是进入缓冲区还是被丢弃。 event tracing messages在这种情况下没有提供任何帮助。
省略Content-Length
请求标头将导致400
生成RFC协议错误(即HTTP http.sys
错误请求),因为未声明HTTP有效负载的大小