【问题标题】:how to address the security concern of having an NSException format use a non-string literal如何解决让 NSException 格式使用非字符串文字的安全问题
【发布时间】:2013-08-06 05:23:17
【问题描述】:

我正在使用mailcore2,它都是基于块的。通常他们会这样定义一个操作

SomeMailCoreOp *op = [session getOp];
[op start:^(NSError* error, id result) {
    if (error) {
        // handle error code            
    }    
}];

所以我想做的基本上就是在每次遇到错误时抛出一个NSException。这样我就可以在我的代码库的其他地方捕获它。所以我为NSError创建了一个类别:

@implementation NSError (Addons)

-(NSString *)description {
    return [NSString stringWithFormat:@"%@ - %@",
            [self localizedDescription], [self localizedFailureReason]];        
}
@end

这就是我通常处理错误的方式:

SomeMailCoreOp *op = [session getOp];
[op start:^(NSError* error, id result) {
    if (error) {
        [NSException raise:@"failure" format:[error description]];            
    }    
}];

我认为这是有道理的,因为在documentation for NSException 他们得到了这个format

format,人类可读的消息字符串(即异常 原因)与变量参数的转换规范 跟随。

但当我执行上述操作时,我总是会收到此编译器警告:

format string is not a string literal (potentially insecure)

我该如何解决这个问题?

【问题讨论】:

    标签: iphone objective-c error-handling compiler-errors nserror


    【解决方案1】:

    format 是一个格式字符串,如NSLog()[NSString stringWithFormat:]。你的情况

    [NSException raise:@"failure" format:@"%@", [error description]];
    

    不会产生警告。请查看Apple Docs for formatting string objects 了解更多信息。

    有关为什么使用非文字字符串作为格式不安全的更多信息,请参阅维基百科上的Uncontrolled format string

    请注意,Apple 不鼓励使用 Exceptions 进行流控制:

    来自Cocoa Core Competencies

    尽管在许多编程环境中通常使用异常来控制编程流程或表示错误,但不要在 Cocoa 和 Cocoa Touch 应用程序中以这种方式使用异常。相反,您应该使用方法或函数的返回值来指示发生了错误,并在错误对象中提供有关问题的信息。

    来自Dealing with Error

    如果您来自其他平台和语言,您可能习惯于在大多数错误处理中使用异常。当您使用 Objective-C 编写代码时,异常仅用于程序员错误,例如越界数组访问或无效的方法参数。在发布应用之前,您应该在测试期间发现并解决这些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多