CodeQL 文档

从用户控制的来源构建的数据库查询

ID: swift/sql-injection
Kind: path-problem
Security severity: 8.8
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-089
Query suites:
   - swift-code-scanning.qls
   - swift-security-extended.qls
   - swift-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

如果数据库查询(如 SQL 查询)是从用户提供的数据构建的,而没有进行足够的清理,用户可能会执行恶意数据库查询。攻击者可以制作他们控制的查询的一部分来改变查询的整体含义。

推荐

大多数数据库连接器库都提供了一种使用查询参数或预准备语句安全地将不可信数据嵌入查询的方法。您应该使用这些功能来构建查询,而不是使用字符串连接或类似方法,这些方法没有足够的清理。

示例

在以下示例中,SQL 查询使用字符串插值准备,以直接在查询中包含用户控制的值 userControlledString。攻击者可以制作 userControlledString 来改变 SQL 查询的整体含义。

let unsafeQuery = "SELECT * FROM users WHERE username='\(userControlledString)'" // BAD

try db.execute(unsafeQuery)

更好的方法是使用预准备语句,将 userControlledString 绑定到该语句的参数。控制 userControlledString 的攻击者现在无法改变查询的整体含义。

let safeQuery = "SELECT * FROM users WHERE username=?"

let stmt = try db.prepare(safeQuery, userControlledString) // GOOD
try stmt2.run()

参考

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