我正在尝试创建一个工厂类结构,其中我的抽象基类PDObject根据在NSDictionary中传递给它的信息,将实例实例化为正确的子类。这是我的PDObject的init方法:
- (id)initWithDictionary:(NSDictionary *)dictionary inEnvironment:(PDEnvironment *)environment {
NSString *className = [dictionary objectForKey:@"objectType"];
if (className) {
Class objectClass = NSClassFromString(className);
if ([objectClass isSubclassOfClass:[PDObject class]]) {
self = [[objectClass alloc] initWithDictionary:dictionary inEnvironment:environment];
} else {
NSLog(@"tried to instantiate an object of the wrong object type");
self = nil;
}
} else {
NSLog(@"tried to instantiate an object without an object type");
}
return self;
}
我想知道是否有人知道这种模式存在任何安全问题。我担心恶意的东西可以在字典中传入并实例化一些意想不到的东西。我有一个检查,以确保它是PDObject的正确子类。我在这里应该关注什么,或者我只是偏执狂?
答案 0 :(得分:2)
它不太可能是一个安全漏洞,但将潜在的随机字符串传递给运行时函数并不是运行时强化的东西。风险不是实例化随机类,而是导致应用程序可能崩溃或执行随机代码。
总的来说,我不会超越微不足道的努力。为此,我建议使用NSScanner
扫描类名,看看它是否有明显超出界限的任何字符。我认为扫描alphanumericCharacterSet
就足够了。
答案 1 :(得分:2)
活力很好,我在这里看不到任何特别危险的东西。如果您想避免崩溃,可以检查特定对象a。不是nil
(以防万一)和b。响应您要发送的任何选择器。另请注意,无论您使用哪种保护,谁想要使用您的应用程序进行模拟,都可以使用库插入(满足臭名昭着的DYLD_INSERT_LIBRARIES
环境变量)和Objective-C运行时来实现。