图像处理系统里怎么加安全扫描定时任务?

图像处理服务时,常会接收用户上传的图片——比如头像、证件照、商品图。这些文件看似普通,但万一夹带恶意脚本、伪装成 PNG 的 WebShell,或者利用 ImageMagick 漏洞触发远程执行,后台就可能被悄悄拿下。

别等出事才想起来扫

有个客户用开源图像压缩服务,没加任何校验,结果攻击者上传一张修改过 EXIF 的 JPG,里面嵌了 base64 编码的 PHP 一句话,再通过处理后的缓存路径直接访问,绕过上传限制拿到了服务器 shell。这事之后,他们第一件事就是给图像处理流水线加安全扫描定时任务

怎么设?三步落地

假设你用的是 Linux + Python + ClamAV,图像临时目录是 /var/www/uploads/tmp/,每天凌晨 2 点扫一次新进来的图:

0 2 * * * /usr/bin/clamscan --recursive --infected --remove /var/www/uploads/tmp/ >> /var/log/clamav-scan.log 2>&1

如果想更细粒度控制(比如只扫 24 小时内新增的图片),可以配合 find:

0 2 * * * find /var/www/uploads/tmp/ -name "*.jpg" -o -name "*.png" -o -name "*.gif" -mmin -1440 -print0 | xargs -0 clamscan --infected --remove

图像处理环节也要嵌入扫描

光靠定时扫目录不够。上传即扫描更靠谱。比如在 Flask 图像接口里加一行:

import subprocess
result = subprocess.run(["clamscan", "--stdout", "--no-summary", uploaded_file_path], capture_output=True, text=True)
if "FOUND" in result.stdout:
    raise ValueError("检测到可疑文件,已拦截")

再配合定时任务清理 7 天前的未处理临时图:find /var/www/uploads/tmp/ -type f -mtime +7 -delete,既防漏扫,也省磁盘。

别只盯着病毒,元数据也得看

有些攻击不靠可执行代码,而是篡改图片的 ICC 配置文件或 XMP 元数据注入 JS 脚本。用 exiftool 扫一遍也能提前预警:

0 3 * * * exiftool -j /var/www/uploads/tmp/*.jpg | grep -q "java\|script\|eval" && echo "[WARN] 发现可疑元数据" | mail -s "图像元数据告警" admin@domain.com

配上日志轮转和失败重试机制,这套组合拳跑起来,图像处理服务就踏实多了。