0

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;
    }
}
4

1 に答える 1

0

これはソースコードスキャナーです。以下は、queryForRowSet() を呼び出すメソッドです。SQL ステートメントは、REGID、REGPREFIX、DESCRIPTION、DATAALIAS、SYSTEMALIAS を REGULATORYINFO から選択します。ここで、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;
}
于 2016-10-12T09:10:49.673 に答える