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
构建查询。您必须正确地将变量绑定到查询中。时期。讨论结束。
所以你只好换帮手了。让它接受两个参数而不是一个。第一个是正确使用 ?
的查询,第二个是绑定到查询但辅助方法的值数组。
我正在开发一个基于原始 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
构建查询。您必须正确地将变量绑定到查询中。时期。讨论结束。
所以你只好换帮手了。让它接受两个参数而不是一个。第一个是正确使用 ?
的查询,第二个是绑定到查询但辅助方法的值数组。