Angular 17文件上传功能:如何检测文件中的恶意嵌入对象?
文件上传恶意对象检测方案
前端初步校验(辅助拦截,不能替代后端)
- 扩展名白名单校验:仅允许指定后缀(
.pdf、.xlsx、.xls等),这是最基础的拦截,但容易被篡改,仅作第一道过滤。
示例JS代码:const allowedExts = ['pdf', 'xlsx', 'xls']; const fileExt = file.name.split('.').pop().toLowerCase(); if (!allowedExts.includes(fileExt)) { alert('仅支持PDF、Excel格式文件'); return false; } - MIME类型校验:通过
file.type判断文件类型,但同样可被伪造,仅作辅助验证。
示例JS代码:const allowedMimes = [ 'application/pdf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel' ]; if (!allowedMimes.includes(file.type)) { alert('文件类型不符合要求'); return false; }
后端核心校验(安全关键,必须执行)
1. 文件签名(Magic Number)校验
合法文件都有固定的头部签名,读取文件前几个字节对比,直接拦截伪造格式的文件:
- PDF:头部为
%PDF- - XLSX:头部为
PK\x03\x04(本质是ZIP压缩包) - XLS:头部为
D0\xCF\x11\xE0\xA1\xB1\x1A\xE1
示例Python代码:
def verify_file_signature(file_path, allowed_sigs): with open(file_path, 'rb') as f: header = f.read(8) # 前8字节覆盖多数格式签名 for sig in allowed_sigs: if header.startswith(sig.encode()): return True return False # 调用示例 allowed_signatures = { 'pdf': '%PDF-', 'xlsx': 'PK\x03\x04', 'xls': 'D0\xCF\x11\xE0\xA1\xB1\x1A\xE1' } if not verify_file_signature('uploaded_file.xlsx', allowed_signatures.values()): print('文件格式非法,拒绝上传')
2. 解析文件结构(针对Excel类压缩包)
XLSX是ZIP包,解压后检查内部文件,禁止包含可执行文件或异常路径:
示例Python代码:
import zipfile def check_xlsx_safety(file_path): try: with zipfile.ZipFile(file_path, 'r') as zf: for entry in zf.infolist(): # 拦截危险后缀文件 if entry.filename.lower().endswith(('.exe', '.bat', '.cmd', '.com')): return False # 拦截路径遍历类恶意路径 if '..' in entry.filename or entry.filename.startswith('/'): return False return True except zipfile.BadZipFile: return False # 调用示例 if not check_xlsx_safety('uploaded_file.xlsx'): print('Excel文件包含恶意内容,拒绝上传')
3. 专业安全库扫描
用专门工具检测深层恶意内容:
- PDF:用
PyPDF2检查是否嵌入恶意脚本或文件,或用ClamAV杀毒引擎扫描。 - Excel:用
openpyxl开启安全模式禁用宏(非必要宏场景),或用ClamAV扫描文件。
示例ClamAV扫描代码(Python):
import pyclamd def scan_file_malware(file_path): clamav = pyclamd.ClamdAgnostic() try: result = clamav.scan_file(file_path) if result: return False # 检测到恶意内容 return True except pyclamd.ConnectionError: # ClamAV连接失败时,可选择拒绝上传或记录日志降级处理 return False # 调用示例 if not scan_file_malware('uploaded_file.pdf'): print('文件检测到恶意内容,拒绝上传')
额外安全加固
- 文件存储隔离:上传文件不放在Web根目录,用随机字符串重命名,避免文件名遍历或恶意文件名攻击。
- 目录权限控制:服务器上传目录设置严格权限,禁止执行权限。
- 大小限制:设置合理的文件大小上限,防止DOS攻击。
内容的提问来源于stack exchange,提问作者Pulkit Goyal
相关产品推荐
相关产品推荐

