图片隐私检测(EXIF)
灵感:能力工具箱 exif-privacy(pkg: exifr)。
在浏览器本地解析图片 EXIF/元数据,标出 GPS、拍摄设备、时间等可能泄露隐私的字段,并给出「建议清除后再上传」提示。
何时使用
- 客户现场照片、名片背面图上传前自检
- 「这张图会不会带定位」
硬约束
- 使用
exifr(或等价)纯本地解析,不上传到第三方解析服务。 - 至少检测:GPS(纬度/经度)、Make/Model、DateTime、Lens(若有)。
- 输出:
risks[](高/中)+ 原始关键字段摘要;无 EXIF 则明确「未发现可读 EXIF」。 - 可选:提供「导出已剥离元数据的副本」指引(canvas 重绘或库能力),不强制实现清除。
- 不解读、不展示与业务无关的人脸识别等能力。
推荐实现要点
import exifr from 'exifr'
export async function inspectImagePrivacy(file: Blob) {
const data = await exifr.parse(file, { gps: true })
const risks: Array<{ level: '高' | '中'; key: string; detail: string }> = []
if (!data) return { hasExif: false, risks, summary: {} as Record<string, unknown> }
if (data.latitude != null && data.longitude != null) {
risks.push({
level: '高',
key: 'GPS',
detail: `含定位约 ${Number(data.latitude).toFixed(5)}, ${Number(data.longitude).toFixed(5)}`,
})
}
if (data.Make || data.Model) {
risks.push({
level: '中',
key: 'Device',
detail: [data.Make, data.Model].filter(Boolean).join(' '),
})
}
if (data.DateTimeOriginal || data.CreateDate) {
risks.push({
level: '中',
key: 'Time',
detail: String(data.DateTimeOriginal || data.CreateDate),
})
}
return {
hasExif: true,
risks,
summary: {
make: data.Make,
model: data.Model,
date: data.DateTimeOriginal || data.CreateDate,
gps: data.latitude != null ? [data.latitude, data.longitude] : null,
},
}
}
Agent 步骤
- 实现解析与风险分级展示。
- 自测:带 GPS 的样片应出「高」风险;截图类可能无 EXIF。
- 上传流程:有高风险时默认拦截或二次确认。
附加
- README.md · reference.md · templates/usage.md