如何修复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
相关产品推荐
相关产品推荐

