Checkmarx显示代码具有二次注入风险

时间:2019-01-29 07:58:47

标签: java sql-injection checkmarx

Checkmark扫描了我们的代码,并显示这些代码具有二次注入风险 像这样的代码

@SuppressWarnings("unchecked")
public List<Map<String, Object>> findBySQL(String sql, List<ScalarType> types, List<Object> values, Info info) throws ApplicationException {
    try {
        SQLQuery query = currentSession().createSQLQuery(sql);
        if (types != null) {
            for (ScalarType scalar : types) {
                query.addScalar(scalar.getColumn(), scalar.getType());
            }
        }

        if (values != null) {
            for (int i = 0; i < values.size(); i++) {
                query.setParameter(i, values.get(i));
            }
        }
        query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        return query.list();
    } catch (Exception e) {
        throw new ApplicationException(e, info);
    }
}

我们的代码使用prepareStatement执行sql。 但是为什么这些代码仍然存在风险,我该如何解决?

2 个答案:

答案 0 :(得分:1)

Checkmarx引发错误,因为未验证其为查询参数设置的值的类型。

例如,让我们假设由您的PreparedStatement构成的查询如下,并且您要传递给查询参数的值为'Test'

Select * from XYZ where COL1 = ?

如果您的代码已被盗用,并且如果入侵者在查询参数中传递了'Test' OR 1 = 1,则该条件将始终为true,并将返回表中的所有记录。

因此,在执行查询之前,您应该验证所有输入。

希望这会有所帮助

答案 1 :(得分:0)

为解决Checkmarx中的问题,您需要验证sql字符串