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_v2SQL クエリをある種の AST にコンパイルし、プレースホルダーをバインドされたデータ (整数、浮動小数点数、テキスト、日付など) に置き換える必要があります。

また、クエリは既に AST にコンパイルされているため、クエリの構造はデータ バインディングの前に決定されます。データをバインドするとき、SQL サーバーはユーザー コンテンツをプレーン データと見なし、プレースホルダー AST ノードを単純に置き換えます。その結果、SQL はプログラマーの期待どおりに実行されます。

于 2020-12-04T11:09:36.957 に答える