Я создаю связанный список и использую контейнеры для группировки объекта, следующего и предыдущего свойств. Как и в случае с коллекциями Foundation, я хотел бы реализовать 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:
вместо этого? Это все еще безопасное кодирование?
NSDictionary
, явно записана в кодировке. Думаю, это было бы слабым решением против атак. Сломать кодировку было бы так же просто, как самому закодировать список и проверить двоичный результат. - person André Fratelli   schedule 13.07.2015NSSecureCoding
вместоNSCoding
, я предполагал, что это будет неявно: безопасное кодирование безопасно. Я до сих пор не думаю, что эти обходные пути вообще безопасны. Обратите внимание, что классы Apple, такие какNSArray
, реализуют безопасное кодирование. Они не ограничивают классы, которые могут быть закодированы известными классами, они являются общими. Разве безопасный код не перечисляет известные/ожидаемые классы? Как же тогда Apple это делает? Они не ограничивают, какие классы могут быть закодированы. Так что либоNSArray
лжет, либо есть какое-то реальное решение этой проблемы. - person André Fratelli   schedule 14.07.2015