1

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

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

4

2 回答 2

1

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

例如,让我们假设与您形成的查询PreparedStatement如下,并且您要传递给查询参数的值是“测试”

Select * from XYZ where COL1 = ?

如果您的代码被破坏并且如果入侵者传入'Test' OR 1 = 1查询参数,那么条件将始终为真,并且它将返回表中的所有记录。

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

希望这可以帮助

于 2019-02-07T15:24:20.217 回答
0

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

于 2019-02-07T15:04:52.977 回答