Pergunta

Eu preciso de comunicação cliente-servidor simples com iPhone app, e listas de propriedades XML parecer muito fácil e simples solução que salva-me problemas de lidar com os delegados parser XML e construir essas estruturas mim mesmo.

Eu só quero saber é sábio usar a classe NSPropertyListSerialization com dados externos? Há alguma característica plist obscuros que poderiam ser exploradas?

Foi útil?

Solução

Sim, é seguro usar NSPropertyListSerialization com dados não confiáveis, mas depois de ligar o saco de bytes em um hiearchy de tipos plist, você tem que validar esses tipos certeza de que elas corresponder ao seu formato de dados esperado.

Por exemplo, se você espera um dicionário com chaves de string e NSNumbers como valores, você tem que validar que com algo como:

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;

Se você não fizer isso, a fonte dos dados poderia ter colocado valores plist para o arquivo com mis pareados tipos ou valores ilegais que poderiam causar o seu cliente a se comportar mal e acabar sendo uma vulnerabilidade de segurança.

Outras dicas

@ Jon Hess: obrigado. Criei categoria NSDictionary para reduzir o número necessário de isKindOfClasses.

@interface NSDictionary (TypedDictionary)

-(NSArray *)arrayForKey:(NSString*)key;
-(NSString *)stringForKey:(NSString*)key;
-(NSDictionary *)dictionaryForKey:(NSString*)key;

@end


@implementation NSDictionary (TypedDictionary)

-(NSArray *)arrayForKey:(NSString*)key {
    NSArray *obj = [self objectForKey:key];
    return [obj isKindOfClass:[NSArray class]] ? obj : nil;
}
-(NSString *)stringForKey:(NSString*)key {
    NSString *obj = [self objectForKey:key];
    return [obj isKindOfClass:[NSString class]] ? obj : nil;
}
-(NSDictionary *)dictionaryForKey:(NSString*)key {
    NSDictionary *obj = [self objectForKey:key];
    return [obj isKindOfClass:[NSDictionary class]] ? obj : nil;
}
@end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top