Да, безопасно использовать NSPropertyListSerialization с ненадежными данными, но после того, как вы превратите пакет байтов в список типов plist, вы должны проверить эти типы, чтобы убедиться, что они соответствуют ожидаемому формату данных.
Например, если вы ожидаете словарь со строковыми ключами и NSNumbers в качестве значений, вы должны проверить это с помощью чего-то вроде:
NSString *errorDescription = nil;
NSPropertyListFormat format = 0;
id topObject = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&errorDescription];
NSDictionary *validDictionary = nil;
if ([topObject isKindOfClass:[NSDictionary class]]) {
BOOL allNumbers = YES;
for(id value in [topObject allValues]) {
allNumbers = allNumbers && [value isKindOfClass:[NSNumber class]];
}
if (allNumbers) {
validDictionary = topObject;
}
}
return validDictionary;
Если вы этого не сделаете, источник данных мог поместить значения plist в архив с ошибочно подобранными типами или недопустимыми значениями, которые могут привести к неправильному поведению вашего клиента и стать уязвимостью безопасности.