gpt4 book ai didi

ios - 何时使用 NSSecureCoding

转载 作者:IT王子 更新时间:2023-10-29 07:56:14 25 4
gpt4 key购买 nike

我正在了解 NSSecureCoding Apple 在 iOS 6 中引入的协议(protocol)。

据我目前的理解,只要一个类对其自身的实例进行编码/解码,就应该使用它,以防止替换攻击。

我想知道在其他情况下使用它是否合适。

具体来说,如果一个类通过编码/解码其实例变量而不是其自身的整个实例来符合 NSCoding,那么实现 NSSecureCoding 是否仍然是可取的?


编辑

假设我有一个正在实现 NSCoding 的类,如下所示

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.aString forKey:@"aMeaningfulString"];
}

- (id)initWithCoder:(NSCoder *)decoder {
if((self = [super init])) {
self.aString = [decoder decodeObjectForKey:@"aMeaningfulString"];
}
return self;
}

并假设不涉及 XPC。此类的实例将存档在存储在磁盘上的 plist 中。

在安全方面,使用 -decodeObjectOfClass:forKey: 有什么好处吗?-decodeObjectForKey:?

最佳答案

Specifically if a class conforms to NSCoding by encoding/decoding its instance variables, as opposed to the whole instance of itself, would it still be advisable to implement NSSecureCoding?

这取决于您的应用需求。对于任何旧应用程序,使用普通 NSCoding 将内容持久保存到磁盘是可以的,因为正在写入的信息和应用程序本身在本质上(不应该)是敏感的。但是,假设您是一家发布应用程序的银行。您可以选择将一些帐户信息或 API key 保存到磁盘,以便您可以与您的服务通信、验证用户的身份等。您可能不需要整个对象,但这无关紧要。 NSCoder 不关心正在读取的什么,只关心它可以读取它并正确地完成它的工作。这是一个问题。

Security-wise, is there any benefit in using -decodeObjectOfClass:forKey: as opposed to -decodeObjectForKey:?

是的,非常重要。您依赖 NSCoder 来序列化/反序列化一个对象(更不用说正确的对象)这一事实是一个巨大的攻击向量。一旦黑客修改了 NSCoder 使用的格式的信息(一种类似 plist 的结构,既易于人类阅读又具有很强的可读性),那么就没有办法保证你得到的就是你输入的. NSCoder 不关心有人决定切换存档中包含的类,所以你正在重新构造一个恶意类的对象,运行时也不关心。事实上,足够聪明的黑客会向应用程序中注入(inject)补丁,以确保反序列化的对象会引发某种未定义状态(堆栈溢出),这可能会被用来潜在地利用整个应用程序。

decodeObjectOfClass:forKey: 允许您强制 NSCoder 在反序列化方面更加智能,并且它修补了一个非常大的漏洞。这并不是说你不应该永远不要在没有NSSecureCoding的情况下使用 NSCoder,而是说你必须聪明地知道你在什么情况下使用它。

关于ios - 何时使用 NSSecureCoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17301769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com