最近项目在运行过程中用户们又反应了一个问题,说会偶尔出现图片上传失败的情况。然后将那些失败的图片拿过来进行验证,果然问题出现了,用ie浏览器在上传附件时,会显示这个请求挂起了。用谷歌浏览器在上传附件时,会返回一个Provisional headers are shown,也就是临时的请求头。项目中使用的是F5做负载均衡,并且F5的IP绑定了WAF(网络中间设备,发布web服务时开启的安全策略),后面就是web应用服务器。

问题分析:大部分的附件都可以成功,就是偶尔有几个图片上传时,出现请求被挂起的现象。但直接通过web应用服务器IP访问,验证功能时,这些上传失败的图片都可以成功。并且这些图片在另存之后也可以上传成功。导致这样的问题,第一反应就是请求被F5拦截了。只要绕开F5之后上传失败的图片都没问题。不过。。。。。可达鸭眉头一皱。。。。。为什么图片在另存之后,继续通过F5上传图片,图片也会成功呢?

继续找原因,这些上传失败的请求想通过在F5抓包,看一下是什么情况。但这些请求都没有到F5。

Web应用防火墙日志其匹配特征与规则库massive_null_payload匹配,即上传的.jpg图片文件中的payload疑似含“命令注入”代码。简单来说就是这个图片不安全,处理方式也就很简单了,排查.jpg文件的安全性,核查原始.jpg文件MD5是否一致,排查.jpg文件宿主机的主机环境安全,必要时,进行相关主机杀毒清查动作。经过这一系列检查、操作后,用户们的问题得到解决。

以上是该项目出现的问题,如果有同学遇到和我相同的问题,并和这个项目的环境一样,可以检查一下对应的waf。如果只是问题一样但是环境不同,那么建议这些同学可以浏览一下这篇博客:


Chrome请求出现Provisional headers are shown的几次经历


文件上传被 firewalledrequest_上传图片被防火墙拦截