【问题标题】:Sqlite shows EXC_BAD_ACCESS in ios SDKSqlite 在 ios SDK 中显示 EXC_BAD_ACCESS
【发布时间】:2013-05-07 22:57:27
【问题描述】:

此代码在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;
   }

【问题讨论】:

    标签: ios objective-c sqlite


    【解决方案1】:

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

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

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

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

    繁荣

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

    【讨论】:

    • 感谢回复..但我仍然很困惑,请给我一个示例如何将查询直接传递给 [database executenonquery:...]
    • [数据库 executeNonQuery:@"INSERT INTO ? VALUES (?,?,?,?,?,?,?,?,?);",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"]; //我试过了,对吗..?
    • 这似乎是 API 的设计方式,是的。
    猜你喜欢
    • 2018-09-21
    • 1970-01-01
    • 2011-04-10
    • 2012-07-24
    • 1970-01-01
    • 2021-04-23
    • 2012-09-21
    • 2013-12-13
    • 2015-02-07
    相关资源
    最近更新 更多