java - 无法使用 OWASP.ESAPI 缓解 SQL 注入(inject) - Veracode

标签 java sql-injection owasp esapi veracode

我正在对我的 Java 代码执行 veracode 扫描,它在我的 DAO 类之一中引发以下错误

SQL 命令中使用的特殊元素的不正确中和(“SQL 注入(inject)”)CWE ID 89

但是,我尝试使用 OWASP.ESAPI 库来缓解这种情况,因为我无法使用参数化输入来构建查询,因为我使用的是字符串构建器。以下是我正在尝试处理的示例代码

private static String getPhoneDataSql(QuerySearchType type, PhoneQueryParams queryParams){      
    StringBuilder sql = new StringBuilder("select * from users where ");
    List<String> sqls = new ArrayList<String>();

    if(StringUtils.isNotBlank(queryParams.getUserId())){
        sqls.add("USER_ID like ".concat(type.format(encodeSQLInput(queryParams.getUserId()))));
    }
    if(StringUtils.isNotBlank(queryParams.getUserName())){
        sqls.add(UNAME_LIKE.concat(type.format(encodeSQLInput(queryParams.getUserName()))));
    }
    if(StringUtils.isNotBlank(queryParams.getCompany())){
        sqls.add("STR_COMPANY like ".concat(type.format(encodeSQLInput(queryParams.getCompany()))));
    }   

    boolean firstAnd = false;
    for(String s : sqls){
        sql.append(firstAnd ? STR_SQL_LIKE : "").append(s);
        firstAnd = true;
    }
    return sql.toString();
}

private static String encodeSQLInput(String sqlInput){  
    Codec ORACLE_CODEC = new OracleCodec();
    if(sqlInput == null) {
        return "NULL";
    }   
    sqlInput = ESAPI.encoder().encodeForSQL( ORACLE_CODEC, sqlInput);
    return sqlInput;
}

有人可以帮忙吗?

最佳答案

像 Veracode 这样的 SQL 注入(inject)扫描程序通常会提示,如果它们发现您正在通过与应用程序变量的字符串连接来构建 SQL 查询。他们无法判断您是否已正确转义应用程序变量中的内容以确保其安全。

最好避免字符串连接,因为它很容易犯错误并意外地导致 SQL 注入(inject)漏洞。

相反,请使用查询参数。不要连接字符串,而是在 SQL 字符串中保留像 ? 这样的占位符,并将变量绑定(bind)到语句。

文档中有很多示例:https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

关于java - 无法使用 OWASP.ESAPI 缓解 SQL 注入(inject) - Veracode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59855519/

相关文章:

php - 为什么 mysql_real_escape_string 返回 bool 值?

single-page-application - ZAP 可以用于 SPA 应用吗

java - 使用新比较器时 TreeMap putall 问题

java - 如何取消隐藏/调用带有两个参数的 jframe 类

java - 联合测试: testing all possible boundaries?

php - 这个sql表结构会阻止未经授权的sql插入吗?

java - 除了 Java 之外,还有哪些语言具有非特权代码与特权代码的安全模型?

python - PyMySQL 如何防止用户遭受 sql 注入(inject)攻击?

php - SQL 注入(inject)易受攻击的代码,即使我们正在清理输入 mysql_real_escape_string

security - Jenkins 构建不会在 OWASP 依赖检查器发现漏洞的管道阶段失败