java - Checkmarx 显示代码存在二阶注入(inject)风险

标签 java sql-injection checkmarx

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/

相关文章:

java - 如何修复 A2-破坏的身份验证和 session 管理警告?

node.js - 如何在 Postgres/node 中正确转义原始 SQL 查询 (plainto_tsquery)

java - 使用 checkmarx 时 Servletoutputstream.write 存在 XSS 漏洞

java - 在 JavaFx 和 Webstart (JNLP) 中提供触摸控制

java - 为什么在创建抽象类的引用类型对象和访问其自己的成员时存在这种差异?

php - 我如何使这个查询 sql 注入(inject)证明?

php - 从 mysql_query 转换为准备好的语句(mysqli/PDO)?必要的?

kotlin - 二阶 SOQL SOSL 注入(inject) SFDC

java - 在 ListView 中显示来自数据库 firebase 的 url 图像

java - 读取和替换 java 中的行