我正在创建一个链接列表并使用容器对对象、下一个和上一个属性进行分组。就像基金会收藏一样,我希望它能够实现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:
反而?它仍然是安全编码吗?
我最终将同样的问题发布到 Cocoa 的邮件列表中,最有趣的讨论发生了。一些亮点:
[...] 制作一个包含普通内容的 NSArray,例如 NSString、NSNumber、encode
使用decodeObjectForClasses 对其进行解码,不带任何类。你会
阵列失败。将 NSArray 添加到允许的类列表中并
.. 有用。所以,你认为 NSArray 会盲目地解码任何东西,所以
它不再安全。
添加自定义类的对象
在数组中实施安全编码,它将开始失败
再次。 NSArray 和其他集合类型允许以下元素
已知的安全系统类型,例如 NSString,但在任何外部都会失败
那。 [...]
此时我明白 NSArray 的行为并不符合我的预期。安全编码似乎不再那么安全了:
这似乎远非理想 [...]事实上,它解码了一组
已知实现 NSSecureCoding 的类是错误的,IMO,对于两个
原因 [...]
1)所包含的类实现 NSSecureCoding 的事实做
并不意味着我在期待它. [...]
2)它限制了可以存储的类。 [...]
在替代攻击中获得我没有预料到的课程尤其可怕。但显然 Cocoa 的承诺是不同的:
[...]如果你直接使用 NSArray() 或其他集合类
你的编码,你需要检查你返回的内容。他们是
“安全地”解码到苹果认为解码的程度
不会导致缓冲区溢出等,这就是你所经历的一切
默认. [...]
So, no, NSSecureCoding
不保证容器的安全编码,或者至少不保证类型检查,您必须自己进行。甚至在 Cocoa 的本机数据结构中也没有,正如我最初假设的那样(我仍然认为这是有原因的)。
罗兰·金的所有努力都归功于道具。你可以看到完整的对话here http://lists.apple.com/archives/cocoa-dev/2015/Jul/msg00244.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)