0

此代码在 iphone、ipad 模拟器xcode 4.5xcode 4.6.Also 中完美地与设备一起调试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;
   }
4

1 回答 1

2

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

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

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

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

繁荣

如果您要将完整的查询组合到您的insertQuery字符串中,那么您需要将它传递给任何可以直接评估 SQL 的对象。查看调用,我敢打赌,这executeNonQuery:arguments:将再次通过字符串和/或参数将参数绑定到?s.

于 2013-05-07T05:44:16.157 回答