从用户控制的来源构建的数据库查询¶
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
如果数据库查询(如 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()
参考¶
维基百科:SQL 注入.
OWASP:SQL 注入预防秘籍.
通用弱点枚举:CWE-89.