CodeQL 文档

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

点击查看 CodeQL 代码库中的查询

代码在将用户输入作为 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);
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私