sprintf(sql, "SELECT * FROM users WHERE name='%s'", input);
// 輸入 ' OR '1'='1 導致繞過鑒權
SQL 模板預編譯,參數佔位符 ?,執行時綁定數據,數據庫引擎將代碼與數據分離,徹底杜絕注入。
stmt = Prepare(hConn, "SELECT * FROM users WHERE name=? AND age>?");BindParam(stmt, 1, SQL_C_CHAR, name, strlen(name));BindParam(stmt, 2, SQL_C_LONG, &age, 0);Execute(stmt);Fetch(stmt, ...) 逐行取數據。FreeStmt(stmt);| 操作 | ODBC | MySQL C API | PostgreSQL libpq |
|---|---|---|---|
| 預編譯 | SQLPrepare | mysql_stmt_prepare | PQprepare |
| 綁定 | SQLBindParameter | mysql_stmt_bind_param | PQbindParam |
| 執行 | SQLExecute | mysql_stmt_execute | PQexecPrepared |