如何解决Veracode Security Scan中的SQL注入问题

时间:2016-10-11 10:18:20

标签: security veracode

我们正在使用Veracode扫描编码。结果在第51行报告了一个可能的SQL注入。代码如下。

我想知道为什么这是一个SQL注入问题以及如果是的话如何修复它。

@Override
public CloseableSqlRowSet queryForRowSet(String sql, SqlParameterSource paramSource) throws DataAccessException {
    try {
        conn = getJdbcTemplate().getDataSource().getConnection();
        psc = getPreparedStatementCreator(sql, paramSource);
        ps = psc.createPreparedStatement(conn);
        applyStatementSettings(ps);
        resultSet = ps.executeQuery();     // this is line 51
        return new CloseableResultSetWrappingSqlRowSet(resultSet, this);
    } catch (SQLException ex) {
        this.release();
        throw translateSqlException(sql, ex);
    } catch (Exception e) {
        this.release();
        throw e;
    }
}

1 个答案:

答案 0 :(得分:0)

这是一个源代码扫描程序。下面是一个调用queryForRowSet()的方法。 sql语句是从REGULATORYINFO中选择REGID,REGPREFIX,DESCRIPTION,DATAALIAS,SYSTEMALIAS,其中REGPREFIX =:regprefix。

请参阅以下代码。

private boolean validateProductVersion(ConfigPackage configPackage,ProductConfig productConfig){

    NamedParameterJdbcOperations toosetEnvTemplate = jdbcTemplateUtil.getNamedParamJdbcTemplate(configPackage.getToolsetEnvAlias());

    Map<String, Object> param = new HashMap();
    param.put("regprefix", productConfig.getToolsetProduct().getRegulatorId());
    SqlRowSet rowSet = toosetEnvTemplate.queryForRowSet(
            "select REGID, REGPREFIX, DESCRIPTION, DATAALIAS, SYSTEMALIAS from REGULATORYINFO where REGPREFIX = :regprefix",
            param);
    if (!rowSet.next()){
        return false;
    }

    VersionNumber toolsetMaxVer = VersionNumber.createFromString(productConfig.getToolsetProduct().getMaxVersion());
    VersionNumber toolsetMinVer = VersionNumber.createFromString(productConfig.getToolsetProduct().getMinVersion());

    String productVersion = "";
    Map<String, Object> paramMap = new HashMap();
    paramMap.put("productname", productConfig.getToolsetProduct().getRegulatorId());

    productVersion = toosetEnvTemplate.queryForObject(
            "select PRODUCTVERSION from INSTALLEDPRODUCTVERSIONS where PRODUCTNAME=:productname AND STBSTATUS='A'",paramMap, String.class);

    VersionNumber productVer = VersionNumber.createFromString(productVersion);
    if (!org.apache.commons.lang3.StringUtils.isEmpty(productConfig.getToolsetProduct().getMinVersion()) && productVer.isLower(toolsetMinVer)) {
        return false;
    }
    if (!org.apache.commons.lang3.StringUtils.isEmpty(productConfig.getToolsetProduct().getMaxVersion()) && productVer
            .isHigher(toolsetMaxVer)) {
        return false;
    }

    return true;
}