不要轻易给出你的通讯录权限

发表于 2023-12-04 09:42:05
更新于 2024-04-18 13:33:37
iOSSwift

App 拿到你的通讯录很容易

这是 iOS 模拟器上,通许录的截图:

这是执行代码后,获取到的通许录信息:

可以看到通许录的联系方式和姓名,都直接被明文的方式拿到了。这一点我觉得苹果方面做的很差,应该设计成还需要调用苹果的接口解密的机制,苹果方面需要对解密方做好安全校验或者备案的机制才能解密。

当然,我们得在 App 第一次运行是允许它获取通许录。通常很多 App 在第一次运行时,请求很多权限,普通用户没有安全意识一路点过去,很容易中招。

很多人给家人的备注不是姓名而是称呼,这样攻击者很容易知道你们的关系。

从前就看到过相关报道,攻击者称某人出车祸了在医院,给其妈妈打电话要求先转钱帮忙缴费,母亲爱子心切就把钱转给了骗子。

获取通讯录代码

swift
import SwiftUI
import Contacts

struct ContentView: View {
    @State private var contacts: [CNContact] = []
    
    var body: some View {
        VStack {
            Button("请求通讯录权限") {
                requestContactsPermission()
            }
            .padding()
            
            List(contacts, id: \.identifier) { contact in
                Text("\(contact.givenName) \(contact.familyName)")
            }
        }
    }

    func requestContactsPermission() {
        let contactStore = CNContactStore()

        switch CNContactStore.authorizationStatus(for: .contacts) {
        case .authorized:
            fetchContacts()
            
        case .notDetermined:
            contactStore.requestAccess(for: .contacts) { (granted, error) in
                if granted {
                    DispatchQueue.main.async {
                        self.fetchContacts()
                    }
                } else {
                    print("用户拒绝了通讯录权限")
                }
            }
            
        case .denied, .restricted:
            print("通讯录权限被拒绝或受到限制")
            
        @unknown default:
            break
        }
    }

    func fetchContacts() {
        do {
            let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]
            let request = CNContactFetchRequest(keysToFetch: keysToFetch as [CNKeyDescriptor])

            try CNContactStore().enumerateContacts(with: request) { contact, _ in
                contacts.append(contact)
                print(contact.givenName, contact.familyName, contact.phoneNumbers.first?.value.stringValue)
            }
        } catch {
            print("无法获取通讯录信息: \(error.localizedDescription)")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

感悟

骗子可恨。我们作为普通用户应该提高自身防范意识,对于 App 一切权限的申请,需要考虑合理性,不要一路点过去。

像通迅录这种权限,骗子获取到后肯定直接上传了,事后再关闭权限也于事无补,所以需要谨慎再谨慎。

也逐渐理解了,我们国家网站需要备案,后续逐渐 App、小程序等都需要备案,虽然作为开发者会有一些麻烦,但是这样更少人会被骗,我觉得这是值得的。

如今信息被滥用,甚至一些正常业务的 App 也会卖收集到的用户信息。

所以我的建议是,这种隐私度极高的权限不要轻易给出。