You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Sonarqube检测到的Salesforce SOQL注入风险问题?

解决SonarQube检测到的SOQL注入风险问题

问题根源

你的核心问题是直接将日期字符串拼接进SOQL语句,既触发了SonarQube的注入风险检测,又因尝试String.escapeSingleQuotes破坏了日期查询的语法规则,导致查询异常。

可行解决方案

彻底规避SOQL注入的正确方式是使用绑定变量(Bind Variables),而非字符串拼接。以下是完整的修改步骤:

1. 改造AggregateResultIterator类,支持绑定参数

更新构造函数,使其能接收查询字符串和绑定变量列表,通过安全的绑定方式执行查询:

global without sharing class AggregateResultIterator implements Iterator<AggregateResult> {
    AggregateResult [] results {get;set;}
    Integer index {get; set;} 
    
    // 新增支持绑定变量的构造函数
    global AggregateResultIterator(String query, List<Object> bindVariables) {
        index = 0;
        results = Database.queryWithBinds(query, bindVariables, AccessLevel.USER_MODE);
        System.debug('results: ' + results);
    } 
    
    global boolean hasNext() { 
        return results != null && !results.isEmpty() && index < results.size(); 
    }    
    
    global AggregateResult next() {        
        return results[index++];            
    }     
}

注:Database.queryWithBinds是Salesforce推荐的安全查询方式,指定AccessLevel.USER_MODE可确保权限检查符合安全规范。

2. 修改Batch的start方法,使用绑定变量构建查询

不再将日期转为字符串拼接,而是用:startDate、:endDate作为占位符,直接传递Date类型变量作为绑定参数:

// 无需转换日期为字符串,直接使用原始Date变量
String query =  ' SELECT OpportunityLineItemId, SUM(Revenue) Revenue,  '+ 
                        ' OpportunityLineItem.OpportunityId, OpportunityLineItem.Opportunity.AccountId, '+ 
                        ' Order_Item__r.Supplying_Entity__c, OpportunityLineItem.Opportunity.Legal_Entity_Account__c '+ 
                        ' FROM OpportunityLineItemSchedule '+ 
                        ' WHERE OpportunityLineItem.Opportunity.StageName = \'Closed Won\' AND ScheduleDate >= :startDate AND ScheduleDate <= :endDate '+
                        ' GROUP BY OpportunityLineItemId, OpportunityLineItem.OpportunityId, OpportunityLineItem.Opportunity.AccountId,' +
                        ' Order_Item__r.Supplying_Entity__c, OpportunityLineItem.Opportunity.Legal_Entity_Account__c ';

// 准备绑定变量列表
List<Object> bindVars = new List<Object>{startDate, endDate};
return new AggregateResultIterator(query, bindVars);

3. 原方案失败原因解析

  • String.escapeSingleQuotes会转义字符串中的单引号,但SOQL中Date类型值不需要加单引号,转义后直接破坏了查询的语法结构,引发QueryException。
  • 手动拼接带单引号的字符串仍然存在注入风险,同时若日期格式不符合Salesforce预期(如地区格式差异),也会导致查询失败。

额外注意

如果AggregateResultIterable是包装AggregateResultIterator的容器类,需同步修改其构造函数,支持传递绑定变量列表,确保整个调用链路的安全性。

内容的提问来源于stack exchange,提问作者Diego Sanchez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:02:10