Checkmark 扫描了我们的代码并显示这些代码存在二阶注入(inject)的风险 像这样的代码
@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。 但为什么这些代码仍然存在风险,如何修复呢?
最佳答案
Checkmarx 会抛出错误,因为您为查询参数设置的值未验证其类型。
例如,假设使用 PreparedStatement
形成的查询如下,并且您要传递给查询参数的值为“Test”
Select * from XYZ where COL1 = ?
如果您的代码被泄露,并且入侵者在查询参数中通过了'Test' OR 1 = 1
,那么条件将始终为真,并且会返回表中的所有记录。
因此,在执行查询之前,您应该验证所有输入。
希望这有帮助
关于java - Checkmarx 显示代码存在二阶注入(inject)风险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54416292/