And*_*lli 7 objective-c nssecurecoding
我正在创建一个链表并使用容器对对象,下一个和以前的属性进行分组.像基金会收藏品一样,我希望它能够实施NSSecureCoding.这是宣言:
@interface ListContainer : NSObject <NSCopying, NSSecureCoding>
@property (readonly, nonatomic) id object;
@property (nonatomic) ListContainer * next;
@property (nonatomic) ListContainer * previous;
@end
Run Code Online (Sandbox Code Playgroud)
当实现该- 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;
}
Run Code Online (Sandbox Code Playgroud)
我应该用-decodeObjectForKey:吗?它仍然是安全的编码吗?
我最终将同样的问题发布到 Cocoa 的邮件列表中,最有趣的讨论发生了。一些亮点:
\n\n\n\n\n[...] 用普通的东西创建一个 NSArray,比如 NSString、NSNumber,对它进行编码\n,使用decodeObjectForClasses 对其进行解码,不带任何类。您\xe2\x80\x99ll\n 在阵列上失败。将 NSArray 添加到允许的类列表中,\n .. 它可以工作。所以,你认为 NSArray 会盲目地解码任何内容,因此它\xe2\x80\x99s 不再安全。
\n\n将实现安全编码的自定义类的对象添加到数组中,\n 它将再次开始失败。NSArray 和其他集合类型允许已知安全系统类型(如 NSString)的元素,但在该类型之外的任何元素都会失败。[...]
\n
此时我明白 NSArray 的行为并不符合我的预期。安全编码似乎不再那么安全:
\n\n\n\n\n这似乎远非理想 [...] 事实上,它解码一组已知实现 NSSecureCoding 的类是错误的,IMO,有两个原因 [...]
\n\n1) 所包含的类实现 NSSecureCoding 的事实并不意味着我期待它。[...]
\n\n2)它限制了可以存储的类。[...]
\n
在替代攻击中得到一个我没有预料到的类是特别可怕的。但显然 Cocoa 的承诺是不同的:
\n\n\n\n\n[...]如果您在编码中直接使用 NSArray() 或其他集合类,则需要检查返回的内容。它们被\n\xe2\x80\x98安全地\xe2\x80\x99解码到Apple认为解码它们\n不会导致缓冲区溢出等的程度,\n默认情况下\xe2\x80\x99是你得到的所有\n。[...]
\n
因此,不,NSSecureCoding不能保证容器的安全编码,或者至少不能保证类型检查,您必须自己进行。甚至在 Cocoa 的本机数据结构中也没有,正如我最初假设的那样(有道理,我仍然这么认为)。
罗兰·金的所有努力都归功于道具。您可以在此处查看完整的对话。
\n| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |