Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Checkmarx显示代码存在二阶注入的风险_Java_Sql Injection_Checkmarx - Fatal编程技术网

Java Checkmarx显示代码存在二阶注入的风险

Java Checkmarx显示代码存在二阶注入的风险,java,sql-injection,checkmarx,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 {

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);
    }
}
@SuppressWarnings(“未选中”)
公共列表findBySQL(字符串sql、列表类型、列表值、信息)引发ApplicationException{
试一试{
SQLQuery=currentSession().createSQLQuery(sql);
if(类型!=null){
for(ScalarType标量:类型){
query.addScalar(scalar.getColumn(),scalar.getType());
}
}
如果(值!=null){
对于(int i=0;i
我们的代码使用preparedStatement来执行sql。
但是为什么这些代码仍然存在风险,我如何修复它?

要解决Checkmarx中的问题,需要验证sql字符串是否会抛出错误,因为您为查询参数设置的值没有针对其类型进行验证

例如,假设使用
PreparedStatement
形成的查询如下,并且要传递给查询参数的值为“Test”

Select * from XYZ where COL1 = ?
如果您的代码被破坏,并且如果入侵者通过了查询参数中的
'Test'或1=1
,则该条件将始终为true,并将返回表中的所有记录

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


希望这有帮助

此函数如何保证
sql
类型中的列
是安全的?如果调用方使用不安全的内容创建这些对象,则生成的查询将不安全。恐怕像这样接受任意输入的函数
findBySQL()
在设计上是一个SQL注入漏洞。您可以在
types
列表中列出各个列的白名单,但是
sql
中的整个查询必须是不可信的。问题始于
types
可能为空。事实上,完全避免这个功能。