当数据库服务器被错误地引导,将查询的动态参数视为查询文本的一部分时,就会发生 SQL 注入。比如查询文本内容本身就是“DROP TABLE STUFENTS”,可能会产生 SQL 注入。为避免这种情况,PostgreSQL 通过协议将动态参数作为单独的实体发送,PQExecParam 就是其中一种方法:
PGresult *PQexecParams(PGconn *conn,
const char *command,
int nParams,
const Oid *paramTypes,
const char *const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
PQExecParam 与 PQExec 很像,但提供了额外的功能:参数值可以与命令字符串本身分开指定,查询的结果也可以被指定为文本或者二进制。- paramLengths: 指定二进制格式参数的实际数据长度
- paramFormats: 指定参数是文本还是二进制
- resultFormat: 获取文本格式还是二进制格式结果
除了避免容易出错的引用和转义之外,PQExecParam 只允许在字符串中有最多一个 SQL 命令。