【问题标题】:Delete statement in iphone not workingiphone中的删除语句不起作用
【发布时间】:2012-06-06 12:34:01
【问题描述】:

我正在使用以下代码 sn-p 从表中删除所有数据

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

【问题讨论】:

    标签: iphone sql ios sqlite ios5


    【解决方案1】:

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

    表名不能绑定为变量。

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

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

    【讨论】:

    • 感谢您的回复。实际上,我是从其他 SQL 查询中获取表名的,它会在运行时存储在数组中。所有表名都是动态的,所以我想使用它没有问题。而且,我知道没有人不能让他的应用程序完全不受黑客攻击。但是好奇一个黑客如何仍然可以破解我的数据库,或者如果我绑定变量,他如何仍然可以进行注入攻击。请您对此进行教育。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多