Oui, il est sûr d'utiliser NSPropertyListSerialization avec des données non fiables, mais après avoir transformé le sac d'octets en une hiérarchie de types de plist, vous devez valider ces types pour s'assurer qu'ils correspondent au format de données attendu.
Par exemple, si vous vous attendez un dictionnaire avec les touches de chaîne, et NSNumbers en tant que valeurs, vous devez valider avec quelque chose comme:
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;
Si vous ne le faites pas, la source des données Vous pourriez avoir placé des valeurs de plist dans l'archive avec des types faussement appariés, ou des valeurs illégales qui pourraient amener votre client à se comporter mal et finir par être une faille de sécurité.