此代码在xcode 4.5
和xcode 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;
}
答案 0 :(得分:2)
男孩你好,这是一些危险的代码;不受保护的查询组合+解析! SQL注入攻击潜力很高!
问题是您正在解释动态生成的字符串内容而不考虑字符串中的内容。 Xcode的版本无关紧要。
当您撰写insertQuery
然后将其传递给executeNonQuery:
时,如果该字符串包含任何?
个字符,则需要将另一个参数传递给该方法。
即。说[[d objectForKey:@"ID"]intValue]
返回@"fd?Edfds???sdfefsads?f?"
;这将被解释为在executeNonQuery:
方法中需要六个参数。
<强> BOOM 强>
如果要对insertQuery
字符串进行完整查询,则需要将其传递给可直接评估SQL的任何内容。看一下这个电话,我敢打赌,executeNonQuery:arguments:
会再次通过字符串和/或参数来将参数绑定到?
。