阿里云存储的下载验证

之前写了一篇关于阿里云存储的博客,基本都是关于阿里云存储上传的问题,但是后续在下载时又遇到了一些新的问题,主要是涉及到下载时的校验与安全,所以记录一下这个问题:

大体流程如下:

  1. HEAD 预检:校验 Content-Length 和 ETag (如果匹配 MD5 格式)。

  2. GET 下载:流式写入,并在内存中实时计算 MD5 和检测 Magic Number。

  3. Post 终检:校验最终文件大小、计算出的 MD5 和真实 MIME 类型。

为什么要这么做:

不要相信任何单一来源的信息(Header / 文件名 / MIME),而是通过「预检 → 下载中校验 → 下载后终检」三道防线,逐步降低风险。

这套流程解决的核心问题是:

  • 伪造文件
  • 下载劫持 / 内容篡改
  • MIME 欺骗(如 .pdf 实际是 exe)
  • 超大文件 / 拒绝服务攻击
  • OSS 元数据被污染

具体实现流程:

1. HEAD-预检

  • 通过校验请求头中的Content-Length,防止Dos(大文件上传消耗服务器资源)和异常文件,主要是防止文件下载超过范围、是否存在、是否>0等情况
  • 对ETag进行校验,判断是不是MD5格式,如果是信任则继续下一步校验,不是则抛出错误

其中有一个概念是ETag,ETag其实是一个标识符,这个标识符存储的可能是多种方式,可能存的是版本、缓存标记、文件内容等等,所以此处使用ETag校验是校验其是否为MD5文件,方便后续进行文件内容匹配,防止文件被改动

2. GET-下载

此处是整个流程的核心安全点,采用的是流式的方式进行下载,可以实时做安全判断,而且也可以进行打断

  • 实时计算MD5,主要是叠加计算MD5从而为最终校验做准备
  • 检测 Magic Number,通过下载文件头8-16个字节进行判断,防止伪造攻击

这里实时计算的MD5是可以叠加进行计算的,内容如果一致通过流式的方式来叠加计算出来的MD5也是一样的结果,但是此处实时计算也确实需要下载完成后才能最终进行判断。

3. POST-终检

终检是对文件检查的兜底检查,是将文件下载完成之后再进行一次检查

  • 文件大小检查,对下载后的文件与本地数据库中的file_size进行对比检查
  • MD5检查,即将第二步实时下载计算的MD5叠加计算之后与本地存储的MD5进行对比检查
  • 真实MIME类型检查,通过libmagic对下载后的文件进行完全检查

其中libmagic是对整体文件进行鉴定检查,会涉及文件结构、内容分布、编码方式、内部特征等

相关推荐
九皇叔叔2 小时前
【第二章】Redis基础入门:Redis是什么、为什么快以及核心特性详解
数据库·redis·缓存
云和恩墨2 小时前
删库不跑路,回滚极速触达——zData S“旁路日志”持续保护原理深剖
数据库
MetaLite2 小时前
SpringBoot接口分层规范-外网网关内部服务与参数边界
java·数据库·spring boot
Wang's Blog4 小时前
Java框架快速入门: Spring Security+OAuth2之元注解简化权限表达式
java·数据库·spring
蓝速科技6 小时前
医院导诊 AI 数字人一体机场景适配与落地指南丨蓝速科技
运维·数据库·人工智能·科技·自然语言处理·技术分享
QYR-分析6 小时前
重轨受电弓行业深度报告:市场格局、技术迭代与发展前景
大数据·数据库·人工智能
泡泡鱼(敲代码中)7 小时前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
l1t7 小时前
DeepSeek总结的chdb-core v26.7.3发版说明
数据库·clickhouse·oracle
冰暮流星8 小时前
mysql之表子查询
数据库·mysql
Full Stack Developme9 小时前
CRM相关库表设计
数据库