Objective c FMDB避免sql注入
我正在做一个基于原始sqlite的项目,我已经把它改成了FMDB 所有查询都已参数化 这里有一个这样的例子: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
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,你找到解决办法了吗??就连我现在也面临同样的问题。正如答案所建议的,避免使用带格式的字符串@达亚克文