网站安全防护

文件上传漏洞防护:限制类型远远不够

你的网站有上传功能吗?头像上传、附件上传、图片上传——只要有入口,就可能被利用。很多开发者觉得“我限制了只能传jpg和png,应该没问题“。真的没问题吗?攻击者有至少5种方式可以绕过你的扩展名校验。
网站安全防护
文件上传漏洞防护:限制类型远远不够

你的网站有上传功能吗?头像上传、附件上传、图片上传——只要有入口,就可能被利用。很多开发者觉得“我限制了只能传jpg和png,应该没问题“。真的没问题吗?攻击者有至少5种方式可以绕过你的扩展名校验。

一、攻击者怎么绕过文件类型限制

方式1:改扩展名。把shell.php改名为shell.php.jpg,某些服务器解析时会按最后一个扩展名处理,直接执行PHP代码。
方式2:修改Content-Type。抓包工具把application/octet-stream改成image/jpeg,服务端只检查MIME类型的话就放行了。
方式3:利用.htaccess。上传一个.htaccess文件,把jpg文件解析为PHP执行,然后上传图片马。
方式4:大小写和双写。shell.PHP、shell.pphphp,绕过简单的字符串替换过滤。
方式5:图片马。在正常图片文件尾部追加PHP代码,配合解析漏洞直接执行。

二、只检查扩展名为什么不够

扩展名校验是最基础的防护,但它只验证了文件“叫什么名字“,没有验证文件“到底是什么“。攻击者可以把一个PHP木马改名为.jpg上传,只要服务器有解析漏洞或配置不当,这个文件就会被当作脚本执行。所以真正的防护必须是多层的。

三、文件上传的多层防护方案

第一层:前端校验。在表单提交时用JavaScript检查文件扩展名和大小。这只能挡住正常用户误操作,防不了攻击者,但能减少无效请求。

第二层:后端校验文件头。不要信任Content-Type和扩展名。用PHP的finfo_file或bin2file读取文件真实类型,检查文件头部魔数是否为图片格式(JPEG开头是FFD8,PNG开头是89504E47)。

第三层:重命名和重新生成。上传的文件不要保留原始文件名,用随机字符串重命名。更彻底的做法是用GD库或Imagick把图片重新生成一遍,这样即使图片里藏了代码也会被清除。

第四层:存储目录禁用脚本执行。在Nginx配置中,上传目录location块加入禁止PHP执行的规则。Apache则在目录下放.htaccess禁止执行。这样即使木马上传成功,也跑不起来。

第五层:限制文件大小和频率。设置单文件大小上限和单位时间上传次数限制,防止大文件耗尽带宽或暴力上传测试。

四、怎么验证你的上传功能安全

用一个正常图片和一个图片马分别上传测试。如果图片马能上传成功但无法执行,说明存储目录的脚本禁用生效了。如果图片马上传后被重命名且能正常显示为图片,说明文件重生成机制在工作。两层都过,基本可以放心。

需要专业服务?我们随时为您解答 →

18638624151