Sqlite在ios SDK中显示EXC_BAD_ACCESS

时间:2013-05-07 05:22:50

标签: ios objective-c sqlite

此代码在xcode 4.5xcode 4.6中的iphone,ipad模拟器中运行良好。同时在xcode 4.5中与设备完美配合。 但是当我尝试在xcode 4.6.2中调试设备时,会出现此错误。

这是查询

NSString *insertQuery=[NSString stringWithFormat:@"Insert into %@ (ID,Question,Answer,Option1,Option2,Option3,Explanation,ImageName,Used) values(%d,'%@','%@','%@','%@','%@','%@','%@','%@')",table,[[d objectForKey:@"ID"]intValue],[d objectForKey:@"Question"],[d objectForKey:@"Answer"],[d objectForKey:@"Option1"],[d objectForKey:@"Option2"],[d objectForKey:@"Option3"],[d objectForKey:@"Explanation"],[d objectForKey:@"ImageName"],@"N"];
                        NSLog(@"insert query-%@",insertQuery);
                        [database executeNonQuery:insertQuery];

这是显示EXC_BAD_ACCESS错误的代码

- (BOOL)executeNonQuery:(NSString *)sql, ... 
    {
    va_list args;
    va_start(args, sql);

    NSMutableArray *argsArray = [[NSMutableArray alloc] init];
    NSUInteger i;
    for (i = 0; i < [sql length]; ++i)
         {
        if ([sql characterAtIndex:i] == '?')

                   [argsArray addObject:va_arg(args, id)]; //This line shows error.
    }

    va_end(args);

    BOOL success = [self executeNonQuery:sql arguments:argsArray];

    [argsArray release];
    return success;
   }

1 个答案:

答案 0 :(得分:2)

男孩你好,这是一些危险的代码;不受保护的查询组合+解析! SQL注入攻击潜力很高!

问题是您正在解释动态生成的字符串内容而不考虑字符串中的内容。 Xcode的版本无关紧要。

当您撰写insertQuery然后将其传递给executeNonQuery:时,如果该字符串包含任何?个字符,则需要将另一个参数传递给该方法。

即。说[[d objectForKey:@"ID"]intValue]返回@"fd?Edfds???sdfefsads?f?";这将被解释为在executeNonQuery:方法中需要六个参数。

<强> BOOM

如果要对insertQuery字符串进行完整查询,则需要将其传递给可直接评估SQL的任何内容。看一下这个电话,我敢打赌,executeNonQuery:arguments:会再次通过字符串和/或参数来将参数绑定到?