You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:06:07