如何使用FastAPI的UploadFile验证上传的jar文件类型及扩展名
FastAPI本身未内置针对jar文件的专属校验能力,你可以通过以下两种成熟方案实现真实文件类型校验:
方案1:使用python-magic第三方库校验
该方案通过读取文件二进制特征判断真实格式,不受用户篡改后缀名的影响,是通用的文件校验首选方案。
- 安装依赖:
Windows环境执行pip install python-magic-bin,Linux/macOS环境执行pip install python-magic(需提前在系统中安装libmagic依赖库)。 - 代码示例:
import magic from fastapi import FastAPI, File, UploadFile, HTTPException app = FastAPI() # jar文件本质是zip格式,会识别为这两类MIME类型 ALLOWED_MIME_TYPES = {"application/java-archive", "application/zip"} @app.post("/upload") async def upload(jar_file: UploadFile = File(...)): # 仅读取前1024字节用于校验,避免大文件占用过多资源 file_header = await jar_file.read(1024) # 文件指针复位,后续存储/处理文件时不会丢失内容 await jar_file.seek(0) mime_type = magic.from_buffer(file_header, mime=True) if mime_type not in ALLOWED_MIME_TYPES: raise HTTPException(status_code=400, detail="上传文件不是合法的jar文件") # 后续业务逻辑 return {"filename": jar_file.filename, "status": "校验通过"}
方案2:无额外依赖的魔数校验
如果不想引入第三方依赖,可以直接校验jar文件的魔数(zip格式固定文件头)+后缀名,满足常规场景的校验需求。
jar文件属于zip格式变种,文件前4个字节固定为0x504B0304,对应二进制值为b'PK\x03\x04'。
- 代码示例:
from fastapi import FastAPI, File, UploadFile, HTTPException app = FastAPI() JAR_MAGIC_HEADER = b'PK\x03\x04' @app.post("/upload") async def upload(jar_file: UploadFile = File(...)): # 先校验后缀名 if not jar_file.filename.lower().endswith('.jar'): raise HTTPException(status_code=400, detail="仅支持上传.jar后缀的文件") # 校验文件头魔数 file_header = await jar_file.read(4) await jar_file.seek(0) if file_header != JAR_MAGIC_HEADER: raise HTTPException(status_code=400, detail="上传文件不是合法的jar文件") # 后续业务逻辑 return {"filename": jar_file.filename, "status": "校验通过"}
如果对安全性要求较高,可以将两种方案结合使用,进一步降低被伪造文件绕过校验的概率。
内容的提问来源于stack exchange,提问作者Reznik
相关产品推荐
相关产品推荐

