1

我正在使用以下代码片段从表中删除所有数据

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 注入攻击。请问我知道这个错误背后的原因。我发现很多地方都报告了这个代码片段,因为它工作正常。

4

1 回答 1

2

我无法绑定变量来阻止 SQL 注入攻击。

表名不能绑定为变量。

为避免 SQL 注入攻击,不要让您的用户指定将删除哪些表名。确保表名来自受信任的来源(例如在您的程序中硬编码)。

事实上,当表名来自不受信任的来源时,删除表中的所有数据是一个非常糟糕的主意。即使您阻止了 SQL 注入攻击,攻击者仍然可以删除您不希望他们删除的数据。

于 2012-06-06T12:40:04.960 回答