如何将NSSecureCoding与id对象一起使用

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:吗?它仍然是安全的编码吗?

And*_*lli 3

我最终将同样的问题发布到 Cocoa 的邮件列表中,最有趣的讨论发生了。一些亮点:

\n\n
\n

[...] 用普通的东西创建一个 NSArray,比如 NSString、NSNumber,对它进行编码\n,使用decodeObjectForClasses 对其进行解码,不带任何类。您\xe2\x80\x99ll\n 在阵列上失败。将 NSArray 添加到允许的类列表中,\n .. 它可以工作。所以,你认为 NSArray 会盲目地解码任何内容,因此它\xe2\x80\x99s 不再安全。

\n\n

将实现安全编码的自定义类的对象添加到数组中,\n 它将再次开始失败。NSArray 和其他集合类型允许已知安全系统类型(如 NSString)的元素,但在该类型之外的任何元素都会失败。[...]

\n
\n\n

此时我明白 NSArray 的行为并不符合我的预期。安全编码似乎不再那么安全:

\n\n
\n

这似乎远非理想 [...] 事实上,它解码一组已知实现 NSSecureCoding 的类是错误的,IMO,有两个原因 [...]

\n\n

1) 所包含的类实现 NSSecureCoding 的事实并不意味着我期待它。[...]

\n\n

2)它限制了可以存储的类。[...]

\n
\n\n

在替代攻击中得到一个我没有预料到的类是特别可怕的。但显然 Cocoa 的承诺是不同的:

\n\n
\n

[...]如果您在编码中直接使用 NSArray() 或其他集合类,则需要检查返回的内容。它们被\n\xe2\x80\x98安全地\xe2\x80\x99解码到Apple认为解码它们\n不会导致缓冲区溢出等的程度,\n默认情况下\xe2\x80\x99是你得到的所有\n。[...]

\n
\n\n

因此,不,NSSecureCoding不能保证容器的安全编码,或者至少不能保证类型检查,您必须自己进行。甚至在 Cocoa 的本机数据结构中也没有,正如我最初假设的那样(有道理,我仍然这么认为)。

\n\n

罗兰·金的所有努力都归功于道具。您可以在此处查看完整的对话。

\n