Post

iOS 14 剪贴簿窃资恐慌,隐私与便利的两难

为何那么多 iOS APP 会读取你的剪贴簿?

iOS 14 剪贴簿窃资恐慌,隐私与便利的两难

Click here to view the English version of this article.

點擊這裡查看本文章正體中文版本。

基于 SEO 考量,本文标题与描述经 AI 调整,原始版本请参考内文。

文章目录


iOS 14 剪贴簿窃资恐慌,隐私与便利的两难

为何那么多 iOS APP 会读取你的剪贴簿?

Photo by [Clint Patterson](https://unsplash.com/@cbpsc1?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText){:target="_blank"}

Photo by Clint Patterson

⚠️ 2022/07/22 Update: iOS 16 Upcoming Changes

iOS ≥ 16 开始非使用者主动操作贴上动作,App 主动读取剪贴簿的行为会跳出询问视窗,使用者需要按允许,App 才能读取到剪贴簿资讯。

[UIPasteBoard’s privacy change in iOS 16](https://sarunw.com/posts/uipasteboard-privacy-change-ios16/){:target="_blank"}

UIPasteBoard’s privacy change in iOS 16

议题

剪贴簿被 APP 读取时的顶部提示讯息

剪贴簿被 APP 读取时的顶部提示讯息

iOS 14 开始会提示使用者 APP 读取了您的剪贴簿,尤其中国大陆的 APP 本来就恶名昭彰,再加上媒体不断的放大报导,造成不小的隐私恐慌;但其实不只中国 APP, 美国 、台湾、日本…世界各地很多大大小小的 APP 全都现形,那到底是为了什么那么多 APP 都需要读取剪贴簿呢?

Google Search

Google Search

安全

剪贴簿可能包含个人隐私甚至密码,如使用 1Password、LastPass…等密码管理器复制密码;APP 有能力读取到就有能力回传回伺服器记录,一切看开发者的良心,真要查的话可透过使用 中间人嗅探 ,监听 APP 回传回伺服器的资料,是否包含剪贴簿资讯。

渊源

剪贴簿 API ,从 iOS 3 2009 年开始就有,只是从 iOS 14 开始会多跳提示告知使用者而已,中间已过十余年,如果是恶意的 APP 也收集够足够的资料了。

为何

为何那么多 APP 不论国内外都会在 打开时 读取剪贴簿呢?

这边要先定义一下,我说的情况是 「APP 打开时」 ,而不是 APP 使用中读取剪贴簿;APP 使用中读取的情况比较偏是 APP 内的功能应用,像是 Goolge Map 自动贴上刚复制的地址、但也不排除有的 APP 会不断偷取剪贴簿资讯。

「一把菜刀可以切菜也可以杀人,取决于用的人拿来做什么」

APP 打开时会读取剪贴簿主要原因是要做「 iOS Deferred Deep Link加强使用者体验 ,如上流程所示;当一个产品同时提供网页及APP时,我们更希望使用者能安装 APP(因黏著度更高),所以当使用者浏览网页版网站时会导引下载 APP,但我们希望下载完开启 APP 会自动打开网页离开时的页面。

EX: 当我在 safari 逛 PxHome 手机网页版 -> 看到喜欢的产品想要购买 -> PxHome 希望流量导 APP -> 下载 APP -> 打开 APP -> 展现刚网页看到的商品

如果不这样做,使用者只能 1. 回到网页上再点一次 2. 在 APP 内重新搜寻一次产品;不管 1 还是 2 都会增加使用者购买上的困难及犹豫时间,可能就不买了!

另一方面以营运来说,知道从哪个来源成功安装的统计,对行销、广告预算投放都有很大的帮助。

为何一定要用剪贴簿,有无其他替代方式?

这是场 猫鼠游戏 ,因为 iOS 苹果本身不希望开发者有办法反向追踪使用者来源,iOS 9 之前的做法是将资讯存入网页 Cookie,APP 安装完后再读取 Cookie 出来用,iOS 10 之后这条路被苹果封住无法使用;退无可退大家才使用最终技 — 「用剪贴簿传资讯」来达成,iOS 14 再次递出新招,提示使用者让开发者尴尬。

另一条路是使用 Branch.io 的方式,记录使用者轮廓(IP、手机资讯),然后用搓合的方式读取资讯,原理上可行,但需要投入大量人力(牵涉到后端、资料库、APP)去研究实作,且可能会误判或碰撞。

*对面的 Android Google 原本就支援此功能,不用像 iOS 这样绕来绕去。

受影响的 APP

可能很多 APP 开发者都不知道自己也出现剪贴簿隐私问题,因为 Google 的 Firebase Dynamic Links 服务也是使用同样的原理实现:

1
2
3
4
5
// Reason for this string to ensure that only FDL links, copied to clipboard by AppPreview Page
// JavaScript code, are recognized and used in copy-unique-match process. If user copied FDL to
// clipboard by himself, that link must not be used in copy-unique-match process.
// This constant must be kept in sync with constant in the server version at
// durabledeeplink/click/ios/click_page.js

所以任何有使用到 Google Firebase Dynamic Links 服务的 APP 都可能中枪剪贴簿隐私问题!

个人观点

资安问题是有的,但就是「 信任」 ,信任开发者是拿来做正确的事;如果开发者要做恶,有更多的地方可以做恶,例如:偷取信用卡资讯、偷记录真实密码…等等,都要比这个有效的多。

提示的用途就是让使用者能注意到剪贴簿读取的时间点,如果不合理就要小心!

读者提问

Q:「TikTok 回应存取剪贴簿是为了侦测滥发垃圾讯息的行为」这种说法是正确的吗?

A:我个人认为只是找个理由搪塞舆论,抖音的意思应该是「为了防止使用者四处复制贴上广告讯息」;但实际可以在讯息输入完成时或是送出讯息时再做阻挡过滤,没必要时时监听使用者剪贴簿的资讯!难道剪贴簿有广告或「敏感」讯息也要管?我又没贴上发表出去。

开发者能做的事

若手边没有备用机可升级 iOS 14 测试,可先从 Apple 下载 XCode 12 用模拟器测看看。

一切都还太新,如果你是串 Firebase 可以先参考 Firebase-iOS-SDK/Issue #5893 更新到最新的 SDK。

如果是自己实作 DeepLink 可以参考 Firebase-iOS-SDK #PR 5905 的修改:

Swift:

1
2
3
4
5
6
7
if #available(iOS 10.0, *) {
  if (UIPasteboard.general.hasURLs) {
      //UIPasteboard.general.string
  }
} else {
  //UIPasteboard.general.string
}

Objective-C:

1
2
3
4
5
6
7
8
9
if (@available(iOS 10.0, *)) {
    if ([[UIPasteboard generalPasteboard] hasURLs]) {
      //[UIPasteboard generalPasteboard].string;
    }
  } else {
    //[UIPasteboard generalPasteboard].string;
  }
  return pasteboardContents;
}

先检查剪贴簿内容是否为网址(配合网页 JavaScript 复制的内容是网址带参数)是才读取,就不会每次开启 APP 都跳剪贴簿被读取。

目前只能如此,提示跳还是会跳,就只是让他更聚焦一点

另外苹果也增加了新的 API: DetectPattern ,帮助开发者能更精确判断剪贴簿资讯是我们要的,然后再读取,再跳提示,使用者能更安心、开发者也能继续使用此功能。

DetectPattern 也还在 Beta、且仅能使用 Objective-C 实作。

或是…

  • 改用 Branch.io

  • 自行实作 Branch.io 的原理

  • APP 先跳客制化 Alert 告知使用者,再读取剪贴簿(让使用者安心)

  • 加入新隐私权条款

  • iOS 14 最新的 App Clips?,网页 -> 导 App Clips 轻量使用 -> 深入操作导 APP

延伸阅读

有任何问题及指教欢迎 与我联络


Buy me a beer

本文首次发表于 Medium (点击查看原始版本),由 ZMediumToMarkdown 提供自动转换与同步技术。

Improve this page on Github.

This post is licensed under CC BY 4.0 by the author.