SQL 查询中的不受控数据¶
ID: cpp/sql-injection
Kind: path-problem
Security severity: 8.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-089
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
代码在将用户输入作为 SQL 查询的一部分传递时,未对特殊元素进行转义。它使用 sprintf
生成 SQL 查询,并将用户提供的數據直接作为参数传递给 sprintf
。这使得代码容易受到 SQL 注入攻击。
建议¶
在将用户提供的字符串转换为 SQL 之前,使用库例程对其进行转义。
示例¶
int main(int argc, char** argv) {
char *userName = argv[2];
// BAD
char query1[1000] = {0};
sprintf(query1, "SELECT UID FROM USERS where name = \"%s\"", userName);
runSql(query1);
// GOOD
char userNameSql[1000] = {0};
encodeSqlString(userNameSql, 1000, userName);
char query2[1000] = {0};
sprintf(query2, "SELECT UID FROM USERS where name = \"%s\"", userNameSql);
runSql(query2);
}