sqlite3_bind_text是否足以阻止iPhone上的SQL注入

时间:2009-05-23 09:32:33

标签: iphone sqlite sql-injection

鉴于声明:

const char *sql = "INSERT INTO FooTable (barStr) VALUES (?)";

以下使用sqlite3_bind_text(和相关的sqlite3_bind_*函数)足以防止SQL注入攻击?

sqlite3 *db; 
sqlite3_stmt *dbps;

int dbrc = sqlite3_open([dbFilePath UTF8String], &db); 
if (dbrc) { 
    // handle error
    return; 
} 

dbrc = sqlite3_prepare_v2 (db, sql, -1, &dbps, NULL);

sqlite3_bind_text(dbps, 1, [userContent UTF8String], -1, SQLITE_TRANSIENT);

dbrc = sqlite3_step(dbps);
if (SQLITE_DONE != dbrc) {
    // handle error
}

sqlite3_finalize (dbps); 
sqlite3_close(db); 

2 个答案:

答案 0 :(得分:11)

是的,如果您只将用户提供的数据传递给sqlite3_bind_ *函数,那么您可以安全地避免SQL注入攻击(这些攻击假设您动态构建查询字符串并且不会正确引用/转义用户提供的数据)

答案 1 :(得分:0)

This answer会在SQL Server运行SQL查询之前告知相同的过程。

sqlite3_prepare_v2应该将SQL查询编译为某种AST,并用绑定数据(整数,浮点数,文本,日期等)替换占位符。

由于查询已经被编译成AST,因此查询的结构是在数据绑定之前确定的。绑定数据时,SQL Server将用户内容视为纯数据,只需用其替换占位符AST节点即可。结果,SQL将按照程序员的预期执行。