
苹果
Core Data 是苹果开发的一种用于管理应用程序的持久化数据的框架。在 Xcode 11 版本中,苹果引入了一种新的安全特性,要求我们在使用 Core Data 的过程中,切换到使用 "NSSecureUnarchiveFromData" 或 NSSecureUnarchiveFromDataTransformer 的子类来确保数据的安全性。
为了更好地理解这个新特性,我们首先来了解一下 Core Data 的基本概念。Core Data 是一种对象关系映射(Object-Relational Mapping,ORM)框架,允许我们以面向对象的方式来处理数据。它提供了一种简单而强大的方法来管理数据模型、持久化数据以及数据的查询和更新操作。在之前的版本中,我们可以直接使用 "NSKeyedUnarchiver" 类来解档数据。然而,这种方式存在一些潜在的安全风险,因为它可能会受到外部攻击者的恶意注入攻击。为了解决这个问题,苹果在 Xcode 11 中引入了 NSSecureUnarchiveFromData 和 NSSecureUnarchiveFromDataTransformer 两个类。使用 NSSecureUnarchiveFromDataNSSecureUnarchiveFromData 是一个用于解档数据的类,它提供了一种安全的方式来确保数据的完整性和安全性。相比于 NSKeyedUnarchiver,NSSecureUnarchiveFromData 提供了更严格的数据验证和处理机制,能够有效地防止恶意注入攻击。下面是一个使用 NSSecureUnarchiveFromData 解档数据的示例代码:Swift// 获取 Core Data 的上下文let context = persistentContAIner.viewContext// 创建一个 NSSecureUnarchiveFromData 实例let unarchiver = NSSecureUnarchiveFromData()// 从数据库中获取存储的数据对象let request: NSFetchRequest<DataObject> = DataObject.fetchRequest()let dataObjects = try context.fetch(request)// 解档数据for dataObject in dataObjects { if let data = dataObject.data { do { let object = try unarchiver.unarchiveTopLevelObjectWithData(data) // 处理解档后的数据对象 // ... } catch { print("FAIled to unarchive data: \(error)") } }}在这个例子中,我们首先获取 Core Data 的上下文,然后创建一个 NSSecureUnarchiveFromData 实例。接下来,我们使用 NSFetchRequest 来获取存储的数据对象,并通过循环遍历来解档每个数据对象的数据。使用 NSSecureUnarchiveFromDataTransformerNSSecureUnarchiveFromDataTransformer 是 NSSecureUnarchiveFromData 的一个子类,它可以将解档过程封装成一个自定义的属性转换器。通过使用 NSSecureUnarchiveFromDataTransformer,我们可以在 Core Data 的数据模型中直接指定使用这个转换器来处理解档过程,从而简化代码并提高可读性。下面是一个使用 NSSecureUnarchiveFromDataTransformer 的示例代码:Swift// 在 Core Data 的数据模型中创建一个属性转换器class SecureUnarchiveTransformer: NSSecureUnarchiveFromDataTransformer { override static var allowedTopLevelClasses: [AnyClass] { return [DataObject.self] }}// 在 AppDelegate 中注册属性转换器func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // ... ValueTransformer.setValueTransformer(SecureUnarchiveTransformer(), forName: NSValueTransformerName(rawValue: "SecureUnarchiveTransformer")) // ... return true}在这个例子中,我们首先创建了一个名为 SecureUnarchiveTransformer 的子类,它继承自 NSSecureUnarchiveFromDataTransformer。我们还重写了 allowedTopLevelClasses 属性,用于指定允许的顶级类。然后,在 AppDelegate 的 didFinishLaunchingWithOptions 方法中,我们通过调用 ValueTransformer 的 setValueTransformer 方法来注册这个属性转换器。通过使用 NSSecureUnarchiveFromData 或 NSSecureUnarchiveFromDataTransformer,我们可以在 Core Data 中更安全地解档数据。这个新特性在 Xcode 11 中引入,通过提供更严格的数据验证和处理机制,有效地防止了恶意注入攻击。无论是直接使用 NSSecureUnarchiveFromData,还是通过 NSSecureUnarchiveFromDataTransformer 进行封装,都能够提高数据的安全性和可靠性。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号