我正在创建一个链接列表,并使用容器对对象、next和以前的属性进行分组。与基金会集合一样,我希望它实现NSSecureCoding。以下是声明:
@interface ListContainer : NSObject <NSCopying, NSSecureCoding>
@property (readonly, nonatomic) id object;
@property (nonatomic) ListContainer * next;
@property (nonatomic) ListContainer * previous;
@end在实现- initWithCoder:方法时,我突然意识到,我不知道要为对象使用哪个类:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
_object = [aDecoder decodeObjectOfClass:<#(__unsafe_unretained Class)#> forKey:@"object"];
BOOL nextIsNil = [aDecoder decodeBoolForKey:@"nextIsNil"];
if (!nextIsNil) {
// Decode next
_next = [aDecoder decodeObjectOfClass:[ListContainer class] forKey:@"next"];
if (_next == nil) {
return nil;
}
// Link the nodes manually to prevent infinite recursion
self.next.previous = self;
}
}
return self;
}我应该用-decodeObjectForKey:代替吗?它还是安全的编码吗?
发布于 2015-07-16 21:11:00
最后,我把同样的问题发到Cocoa的邮件列表上,最有趣的讨论发生了。其中一些重点是:
..。制作一个普通的NSArray,比如NSString,NSNumber,编码它,用decodeObjectForClasses解码它,没有类。你会在数组上失败。将NSArray添加到允许的类列表中。它起作用了。所以,你认为,NSArray会盲目地解码任何东西,这样它就不再安全了。将实现安全编码的自定义类的对象添加到数组中,它将再次失败。NSArray和其他集合类型允许已知安全系统类型的元素(如NSString ),但在此之外的任何元素都会失败。..。
在这一点上,我理解NSArray的行为并不像我预期的那样。安全编码似乎不再那么安全了:
这看起来很不理想..。事实上,它解码了一组已知的实现NSSecureCoding的类是错误的,IMO,有两个原因. 1)包含的类实现NSSecureCoding 并不意味着我期望它是。..。 2)限制了可以存储的类。..。
在替换攻击中得到一个我没有预料到的类是特别可怕的。显然,可可的承诺是不同的,尽管:
..。如果在编码中直接使用NSArray()或其他集合类,则需要检查返回的。它们被“安全地”解码,以至于苹果相信解码它们不会导致缓冲区溢出等等,--这是默认情况下只能得到的。..。
因此,不,NSSecureCoding不能保证容器的安全编码,或者至少它不能保证类型检查,而且您必须自己进行。即使在Cocoa的原生数据结构中也不是我最初假设的那样(有原因,我仍然认为)。
道具给罗兰国王所有的努力。你可以看到完整的对话这里。
https://stackoverflow.com/questions/31307331
复制相似问题