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 分析。