为何Azure WAF允许PostMan图片上传请求却拦截Windows应用请求?
环境
- 客户代理机上的Windows应用支持通过HTTP POST上传图片到服务器
- 请求经Azure Gateway转发,该网关启用了OWASP 3.2全规则集的WAF
- 请求采用MultipartFormData格式提交
问题现象
Windows应用发送的图片上传请求被WAF拦截,但用PostMan发送完全相同的请求却能正常通过。拦截触发的是RULE 200003【Multipart Request Body Strict Validation.】,拦截原因显示为Equal 1 at MULTIPART_STRICT_ERROR.
已尝试方案
- 在Visual Studio控制台应用中直接复用PostMan生成的请求
- 通过Fiddler抓取PostMan的请求格式,修改控制台应用的请求格式与之对齐
- 查阅StackOverflow和Microsoft官方问答,有内容提到这可能是Microsoft侧的Bug,但PostMan的请求仍可正常执行
为什么Azure WAF允许PostMan的请求,却拦截Visual Studio控制台应用或客户的Windows应用?
Multipart请求的细微格式差异
PostMan生成的Multipart请求严格遵循HTTP规范:比如分隔符前后的空白符、换行符采用标准CRLF、头部字段的格式和大小写完全合规。而Windows应用/控制台应用使用的HTTP客户端库(比如旧版.NET HttpClient)在构造请求时,可能存在易忽略的格式问题:- 边界分隔符前后多了或漏了空白字符
- 部分字段头部缺少必要的换行
- 用LF替代了标准的CRLF换行
- Content-Disposition头部的格式存在细微偏差
WAF规则的严格校验逻辑
OWASP 3.2的RULE 200003是对Multipart请求体的强校验规则,会检查请求体结构完整性、分隔符合法性、头部格式等多个维度。PostMan的请求完全符合这些校验标准,而Windows应用的请求只要存在一个微小的格式瑕疵,就会触发WAF的拦截判定。HTTP客户端的实现差异
不同HTTP客户端的Multipart请求构造逻辑有区别:PostMan内置的客户端针对WAF场景做了优化,自动规避了容易触发拦截的格式问题;而.NET等平台的客户端库,尤其是旧版本,在处理边界分隔符、字段头部时的实现细节,刚好踩中了WAF的校验阈值。
内容的提问来源于stack exchange,提问作者Shishir Sasal

