SV.SQL.DBSOURCE
如果一个数据库查询的结果未经检查便用于创建另一个数据库查询,这可能导致 SQL 注入攻击,此错误将检测该情况。
漏洞与风险
SQL 注入会使数据库中的数据处于危险中。由于 SQL 语句中使用了未经验证的用户输入,攻击者可以注入他们希望执行的任何 SQL 语句。这包括删除、更新或创建数据。此外,也可能通过此类型的漏洞从数据库检索敏感数据。此漏洞可能与 SV.DATA.DB 漏洞一起使用。
Klocwork 安全漏洞 (SV) 检查器可识别可能创建危险数据的调用;这些调用被视为不安全的来源。用户所提供的任何数据都可能是不安全的来源,因为用户可能是攻击者,或者可能引入人为错误。
缓解与预防
有关详情,请参阅知识库参数。
示例 1
复制
public ResultSet getAllPeopleWithSameLastName(ServletRequest req, Connection con, int userId) throws SQLException {
Statement statement = con.createStatement();
ResultSet results = statement.executeQuery("SELECT lastName FROM user_data WHERE userid=" + userId);
String lastName = results.getString("lastName");
String query = "SELECT * FROM user_data WHERE lastName = '" + lastName + "'";
return statement.executeQuery(query);
}
针对第 16 行报告 SV.SQL.DBSOURCE:lastName 包含来自数据库(第 14 行)的数据,该数据库与常量字符串相串联并存储在第 15 行的 query 中。第 16 行的“query”作为 SQL 语句执行。这意味着,在相同或其他数据库中执行的 SQL 语句中使用的数据库信息未经检查。如果数据库数据注入 (SV.DATA.DB) 可行,其可能被利用以注入任意 SQL 语句。
相关检查器
外部指导
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 Java 分析。