FMDB 避免 sql 注入

FMDB avoid sql injection

我正在开发一个基于原始 sqlite 的项目,我已将其更改为 FMDB。

所有查询都已参数化。

这是一个这样的例子:

 NSString* sqlQuery = [NSString stringWithFormat:@"SELECT COUNT(*) FROM Contacts WHERE FirstName='%@' AND LastName='%@'", fName,lName];

然后我将它传递给我的助手 class:

 NSInteger count = [[[DB sharedManager] executeSQL:sqlQuery] integerValue];

助手class:

- (NSString*)executeSQL:(NSString *)sql
{
    __block     NSString *resultString = @"";
    [_secureQueue inDatabase:^(FMDatabase *db) {
        FMResultSet *results = [db executeQuery:sql];
        while([results next]) {
            resultString= [results stringForColumnIndex:0];
        }
    }];
    return resultString;
}

我可以做一个类似的解决方法:

    sql = @"SELECT COUNT(*) FROM Contacts WHERE FirstName=? AND LastName=?"
    [db executeQuery:sql,firstParam, secondParam]

但我不想更改辅助方法,我需要将 changed/updated sql 查询传递给我的辅助方法。

我该如何更改:

NSString* sqlQuery = [NSString stringWithFormat:@"SELECT COUNT(*) FROM Contacts WHERE FirstName='%@' AND LastName='%@'", fName,lName];

类似于:

NSString* sqlQuery = [NSString stringWithFormat:@"SELECT COUNT(*) FROM Contacts WHERE FirstName=? AND LastName=?", fName,lName];

如果您想避免 SQL 注入问题,则绝不能使用 stringWithFormat 构建查询。您必须正确地将变量绑定到查询中。时期。讨论结束。

所以你只好换帮手了。让它接受两个参数而不是一个。第一个是正确使用 ? 的查询,第二个是绑定到查询但辅助方法的值数组。