文件上传防御方法
1. 客户端验证
客户端验证通常指通过 JavaScript 在前端对文件进行检查
- 优点:可以快速、友好地提示用户,减少不必要的服务器请求,提升用户体验
- 缺点:非常容易绕过。攻击者可以通过抓包工具(如 Burp Suite)修改 HTTP 请求,或直接禁用 JavaScript。因此,客户端验证绝对不能作为唯一的安全措施
常见的客户端验证包括:
- 文件扩展名验证:检查文件的扩展名是否为允许的类型(如
.jpg
,.png
,.pdf
) - MIME类型验证:检查文件的 MIME 类型(如
image/jpeg
,application/pdf
) - 文件大小验证:限制上传文件的大小,防止恶意文件过大导致服务器资源耗尽
2. 服务器端验证
服务器端验证是防御文件上传漏洞的最后一道防线,也是最可靠的
- 文件扩展名白名单验证:强烈推荐使用白名单。只允许上传特定、已知的安全扩展名,如
.jpg
,.png
,.gif
,.pdf
,.zip
等。绝对不要使用黑名单,因为攻击者总能找到新的绕过方式 - MIME 类型验证:在服务器端验证文件头的 MIME 类型,防止攻击者通过伪造扩展名来上传恶意文件
- 文件内容检测:对上传的文件内容进行深度检查
- 图片:使用
getimagesize()
等函数检测文件是否为真实的图片文件 - 压缩包:检查压缩包中的文件列表,确保没有可执行文件或恶意脚本
- 图片:使用
- 文件重命名:在文件上传后,对其进行重命名,通常是使用一个随机字符串或加密哈希值作为文件名,并去除原始扩展名。这能有效防止攻击者通过文件名猜测 WebShell 的路径