NSClassFromString()安全问题

时间:2013-01-01 19:08:46

标签: objective-c cocoa

我正在尝试创建一个工厂类结构,其中我的抽象基类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的正确子类。我在这里应该关注什么,或者我只是偏执狂?

2 个答案:

答案 0 :(得分:2)

它不太可能是一个安全漏洞,但将潜在的随机字符串传递给运行时函数并不是运行时强化的东西。风险不是实例化随机类,而是导致应用程序可能崩溃或执行随机代码。

总的来说,我不会超越微不足道的努力。为此,我建议使用NSScanner扫描类名,看看它是否有明显超出界限的任何字符。我认为扫描alphanumericCharacterSet就足够了。

答案 1 :(得分:2)

活力很好,我在这里看不到任何特别危险的东西。如果您想避免崩溃,可以检查特定对象a。不是nil(以防万一)和b。响应您要发送的任何选择器。另请注意,无论您使用哪种保护,谁想要使用您的应用程序进行模拟,都可以使用库插入(满足臭名昭着的DYLD_INSERT_LIBRARIES环境变量)和Objective-C运行时来实现。