Objective c FMDB避免sql注入

Objective c FMDB避免sql注入,objective-c,sqlite,fmdb,Objective C,Sqlite,Fmdb,我正在做一个基于原始sqlite的项目,我已经把它改成了FMDB 所有查询都已参数化 这里有一个这样的例子: NSString* sqlQuery = [NSString stringWithFormat:@"SELECT COUNT(*) FROM Contacts WHERE FirstName='%@' AND LastName='%@'", fName,lName]; 然后我将其传递给我的助手类: NSInteger count = [[[DB sharedManager] exe

我正在做一个基于原始sqlite的项目,我已经把它改成了FMDB

所有查询都已参数化

这里有一个这样的例子:

 NSString* sqlQuery = [NSString stringWithFormat:@"SELECT COUNT(*) FROM Contacts WHERE FirstName='%@' AND LastName='%@'", fName,lName];
然后我将其传递给我的助手类:

 NSInteger count = [[[DB sharedManager] executeSQL:sqlQuery] integerValue];
- (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;
}
助手类:

 NSInteger count = [[[DB sharedManager] executeSQL:sqlQuery] integerValue];
- (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]
NSString* sqlQuery = [NSString stringWithFormat:@"SELECT COUNT(*) FROM Contacts WHERE FirstName=? AND LastName=?", fName,lName];
但是我不想更改helper方法,我需要将更改/更新的sql查询传递给我的helper方法

如何更改此选项:

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

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

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


所以你别无选择,只能更换你的助手。让它接受两个参数而不是一个。第一个是正确使用
的查询,第二个是绑定到查询中的值数组,但不是helper方法。

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


所以你别无选择,只能更换你的助手。让它接受两个参数而不是一个。第一个是正确使用
的查询,第二个是绑定到查询中的值数组,但不是helper方法。

至少您关心这个问题。太多的开发人员甚至不知道这是一个问题,每隔一天我们就会收到关于网站因为SQL注入问题而被黑客攻击的消息。是的,现在我需要做艰苦的工作来更改大约300多个查询,我的表包含40个字段,查询的参数范围从1个字段到40个字段。看到我应该取得的成就,我真的很害怕:pHI@TejaNandamuri,你找到解决办法了吗??就连我现在也面临同样的问题。正如答案所建议的,避免使用带格式的字符串@至少你关心这个问题。太多的开发人员甚至不知道这是一个问题,每隔一天我们就会收到关于网站因为SQL注入问题而被黑客攻击的消息。是的,现在我需要做艰苦的工作来更改大约300多个查询,我的表包含40个字段,查询的参数范围从1个字段到40个字段。看到我应该取得的成就,我真的很害怕:pHI@TejaNandamuri,你找到解决办法了吗??就连我现在也面临同样的问题。正如答案所建议的,避免使用带格式的字符串@达亚克文