乐于分享
好东西不私藏

美团删了用户照片,「插件冲突」这个锅谁来背?

美团删了用户照片,「插件冲突」这个锅谁来背?

一个外卖 App,把用户手机里几千张照片删了,然后客服说「第三方插件冲突导致缓存清理异常」。

这个解释糊弄不了写过代码的人。但这件事背后暴露的问题,比美团本身要大得多。

缓存清理怎么可能删到用户照片?

先说技术事实。

App 的缓存文件存在自己的私有目录里,Android 上是 /data/data/com.meituan/ 或 /sdcard/Android/data/com.meituan/。用户的照片存在 /sdcard/DCIM/ 或 /sdcard/Pictures/ 下面。这两个路径隔着十万八千里。

正常的缓存清理代码,删的是自己目录下的临时文件,根本碰不到用户相册。

要删到用户照片,技术上只有两种可能:

第一种,文件路径判断写崩了。 比如拼接路径时变量为空,清理逻辑指向了根目录或者用户存储的根目录,把不该删的文件扫进去了。这种 bug 不罕见,尤其是在多个模块拼接路径、缓存目录和用户目录共用工具函数的时候。

第二种,直接调用了 MediaStore 的删除接口。 Android 的 MediaStore API 可以按条件批量操作媒体文件——包括删除。如果某个清理逻辑里用了 ContentResolver.delete() 并且 WHERE 条件写得有问题,完全可能误删用户照片。

不管是哪种,跟「插件冲突」都没什么关系。这是代码层面的事故,锅甩不到第三方插件上。

真正的问题:一个外卖 App 凭什么能删你的照片?

这才是更值得想的事。

答案在 Android 的权限模型里。当你点了「允许美团访问照片」,你以为给的是「让它看一看」的权限。但在 Android 12 以前,这个权限叫 READ_EXTERNAL_STORAGE,实际上连带着 WRITE_EXTERNAL_STORAGE 一起给了——也就是说,App 不仅能看你的照片,还能改、能删。

Android 13 之后,Google 把权限拆细了,引入了 READ_MEDIA_IMAGES 等细粒度权限,并且推荐开发者使用系统相册选择器(Photo Picker)。这个选择器的逻辑是:App 需要用户选一张照片时,由系统弹出一个选择界面,用户点了哪张,系统只把那一张的临时访问权给 App。App 全程拿不到相册的完整权限。

这个方案从根上杜绝了「误删照片」的可能性——因为 App 根本就没有删除权限。

但问题是,国内大量 App 不用这个方案。

原因很现实:系统选择器的 UI 不能自定义,交互不够「顺滑」,产品经理觉得不好看。更关键的是,很多 App 除了让用户选照片,还有扫描相册做智能推荐、图片搜索等功能,这些功能需要遍历整个相册,系统选择器满足不了。

于是大家继续申请完整的存储权限,继续拥有读写删除用户所有文件的能力。美团出事只是概率问题——这次轮到它了。

iOS 为什么没这个问题?

有人注意到,这次事件只影响 Android 用户。iOS 用户没事。

不是因为 iOS 上的美团代码写得更好,而是 iOS 的权限模型从一开始就不一样。

iOS 上,App 申请相册权限后,能拿到的是 PHAsset 对象的读取权。如果要删除照片,必须调用 PHAssetChangeRequest.deleteAssets(),而这个调用会触发一个系统级弹窗,明确告诉用户「美团想要删除 X 张照片」,用户必须手动确认才能执行。

换句话说,iOS 上 App 做不到静默删除用户照片。不管代码怎么写崩了,最后一道门由系统守着,用户不点确认就删不了。

Android 没有这道门。给了权限就是给了,代码想删就删,用户无感知。

对开发者的启示

如果你是 Android 开发者,这件事值得引以为戒:

能用系统选择器就用系统选择器。 除非你的功能确实需要遍历相册(比如做相册管理工具),否则用 Photo Picker 是最安全的选择。它不需要任何存储权限,从根上消除了误操作的可能性。

文件操作一定要做路径校验。 删除操作的目标路径必须在白名单内,至少要断言目标路径以 App 私有目录开头。不要相信任何拼接出来的路径是「一定对的」。

MediaStore 操作要格外小心 WHERE 条件。 ContentResolver.delete() 如果 WHERE 子句为 null 或者条件过宽,就是在对整个媒体库开刀。这类调用应该有专门的 code review checklist。

测试环境要覆盖「手机里有大量照片」的场景。 开发机上可能只有几张测试图片,不容易触发路径遍历类的 bug。用真实数据量的设备测试,很多隐藏问题才会暴露。

不只是美团的问题

这次事件的本质不是「美团坏」,而是 Android 生态的权限模型给了 App 过大的能力,而大部分 App 出于产品体验的考虑选择了「要完整权限」而不是「要最小权限」。

Google 一直在收紧权限,Photo Picker、Scoped Storage、每次访问都要授权——方向是对的,但推进太慢,而且国内厂商的 ROM 和 App 在跟进上一直拖后腿。

作为用户,最实际的做法:定期检查 App 权限设置,把不必要的照片访问权限关掉。作为开发者,最小权限原则不是一句口号——这次美团用真金白银的公关危机给所有人上了一课。

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 美团删了用户照片,「插件冲突」这个锅谁来背?

猜你喜欢

  • 暂无文章