我正在使用下面的代码段
删除表格中的所有数据NSString *deleteStatementNS = [NSString stringWithFormat:
@"DELETE FROM %@",[tableNames objectAtIndex:i]];
const char *prepareDelete ="DELETE FROM '?'";
const char *tbleName = [[tableNames objectAtIndex:i] UTF8String];
if (sqlite3_prepare_v2(dBase, prepareDelete, -1, &dbpreprdstmnt, NULL) == SQLITE_OK)
{
dbrc = sqlite3_bind_text(dbpreprdstmnt, 1, tbleName, -1, SQLITE_TRANSIENT);
dbrc = sqlite3_step(dbpreprdstmnt);
sqlite3_finalize(dbpreprdstmnt);
dbpreprdstmnt = NULL;
}
else
{
NSLog(@"Error %@",[NSString stringWithCString:sqlite3_errmsg(dBase) encoding:NSUTF8StringEncoding]);
}
但不幸的是删除没有发生我收到错误Error no such table: ?
我无法准备声明。但如果我使用下面的准备声明
const char *prepareDelete =[deleteStatementNS UTF8String];
这绝对没问题。我无法绑定变量来阻止SQL注入攻击。我可以知道这个错误背后的原因。我发现很多地方报告了这段代码,因为它工作正常。
答案 0 :(得分:2)
我无法绑定变量来阻止SQL注入攻击。
表名不能绑定为变量。
为避免SQL注入攻击,请勿让您的用户指定将删除哪些表名。确保表名来自受信任的来源(例如,在您的程序中硬编码)。
事实上,当表名来自不受信任的来源时,删除表中的所有数据是一个非常糟糕的主意。即使您阻止了SQL注入攻击,攻击者仍然可以删除您不希望他们删除的数据。