用户上传的合影做了人脸打码才对外发布,处理方式是直接覆盖原图的人脸像素。有人下载后用 exiftool 抽出一张 160×120 的缩略图,人脸完整可辨。检查发现原图带 EXIF 内嵌缩略图,打码只改了主图数据,元数据原封不动。

一开始怀疑是「上传环节没有剥离元数据这一步」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。打码只处理主图像素,EXIF 里的缩略图没有重写。少数情况下是Pillow 保存时默认保留了原图的 EXIF 块。

不容易想到的是,审核只看主图,缩略图不在检查范围。

先确认文件里有哪些元数据块

exiftool -a -G1 photo.jpg | grep -i -E 'thumbnail|preview'

保存时清空 EXIF 数据

python -c "from PIL import Image;im=Image.open('photo.jpg');im.save('out.jpg',exif=b'')"

接着重写后确认缩略图段已消失

exiftool -ThumbnailImage out.jpg

末了用二进制计数确认没有残留的第二张图

python -c "b=open('out.jpg','rb').read();print(b.count(b'\xff\xd8'))"

别只看报错消失,验证要多做一步。重写后的文件里不再有 ThumbnailImage 段,二进制里只剩一个 JPEG 起始标记,人脸无法从元数据还原。

打码是像素级操作,元数据是字节级残留,图片出站前统一重写一遍比事后审计可靠。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189