2009-05-29 3 views
2

iPhone 응용 프로그램과의 간단한 클라이언트 - 서버 통신이 필요합니다. XML 속성 목록은 XML 파서 대리자를 다루고 이러한 구조를 직접 작성하는 데 따른 번거 로움을 덜어주는 매우 쉽고 간단한 솔루션처럼 보입니다.신뢰할 수없는 출처에서 plists를 안전하게 읽을 수 있습니까?

외부 데이터로 NSPropertyListSerialization 클래스를 사용하는 것이 현명한 방법일까요? 악용 될 수있는 모호한 plist 기능이 있습니까?

답변

1

예, 신뢰할 수없는 데이터와 함께 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

@ 존 헤스 : 감사합니다. 나는 isKindOfClass의 필요한 번호를 줄이기 위해 NSDictionary 카테고리를 만들었습니다.

@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