14

鉴于声明:

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); 
4

2 回答 2

13

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

于 2009-05-23T10:22:26.080 回答
0

这个答案在 SQL 服务器运行 SQL 查询之前告诉了相同的过程。

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

并且由于查询已经被编译成 AST,所以查询的结构在数据绑定之前就已经确定了。绑定数据时,SQL 服务器将用户内容视为纯数据,只需将占位符 AST 节点替换为它即可。结果,SQL 将按照程序员的预期执行。

于 2020-12-04T11:09:36.957 回答