プレースメントリストが確実に信頼できないソースから読み取ることはできますか?
質問
私がiPhoneアプリでシンプルなクライアント - サーバ間の通信を必要とし、XMLプロパティリストは私のXMLパーサデリゲートを扱うと、これらの構造を自分で構築する手間が省け、非常に簡単でシンプルなソリューションのように思えます。
私は疑問に思うことは、外部データとのNSPropertyListSerializationクラスを使用するのが賢明でしょうか?悪用される可能性があります任意の不明瞭なplistの機能がありますか?
解決
はい、それは信頼できないデータでNSPropertyListSerializationを使用しても安全ですが、あなたはplistのタイプのhiearchyにバイトの袋を入れた後、あなたは彼らがあなたの予想データフォーマットと一致を確認しますし、それらの種類を検証する必要があります。
あなたが値として文字列キー、および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の値を配置している可能性があり、あなたのクライアントは、不正な動作やセキュリティ上の脆弱性であること巻き上げるする可能性がありますタイプ、または不正な値と一致しました。
他のヒント
@ジョンヘス:ありがとう。私はNSDictionary
esの必要数を削減するためにisKindOfClass
カテゴリを作成しました。
@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
所属していません StackOverflow