Можно ли безопасно читать списки из ненадежных источников? - PullRequest
2 голосов
/ 29 мая 2009

Мне нужно простое соединение клиент-сервер с приложением iPhone, и списки свойств XML кажутся довольно простым и простым решением, которое избавляет меня от необходимости работать с делегатами синтаксического анализатора XML и создавать эти структуры самостоятельно.

Мне просто интересно, разумно ли использовать класс NSPropertyListSerialization с внешними данными? Есть ли какие-то неясные черты, которые можно было бы использовать?

Ответы [ 2 ]

1 голос
/ 31 мая 2009

Да, безопасно использовать 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 в архив с ошибочно подобранными типами или недопустимыми значениями, которые могут привести к неправильному поведению вашего клиента и стать уязвимостью безопасности.

0 голосов
/ 04 июня 2009

@ Джон Хесс: спасибо. Я создал категорию NSDictionary, чтобы сократить необходимое количество isKindOfClass es.

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...