二阶SOQL SOSL注入SFDC

问题描述

我在 Checkmarx 中遇到错误。

abortJob第209行的方法XXX/classes/Monitoring.cls获取用户输入 来自select元素。
然后,该元素的值会在未经适当清理或验证的情况下流经代码,最终在jobAbortRem的第209行的方法XXX/classes/Monitoring.cls中用于数据库查询中。
这可能使 SOQL注入攻击。

              Source                                Destination   
File          XXXX/classes/Monitoring.cls           XXXX/classes/Monitoring.cls
Line          212                                  217
Object        select                               select
public static void abortJob() //line no. 209
{
    list<CronTrigger> detailId=[select id FROM CronTrigger
                                where (CronJobDetail.Name='myJobName') AND NextFireTime = null]; //line 212
    
    if (detailId.size() > 0)
    {
        Id jobId = [SELECT Id from CronTrigger WHERE id = :detailId].get(0).Id; //and line 217 
        System.abortJob(jobId);
        Monitoring.scheduleJob();
    }
}

请帮助我如何通过 Checkmarx 审查。

谢谢

解决方法

使用escapeSingleQuotes方法清理detailId的每个元素(我建议重命名此

public static void abortJob() { 
    list<CronTrigger> detailId=[select id FROM CronTrigger where (CronJobDetail.Name='myJobName' ) AND NextFireTime =null];
    Id jobId ; 
    for (CronTrigger currentCron : detailId) { 
        jobId = String.escapeSingleQuotes(currentCron.Id); 
    } 
    if (jobId !=null) { 
        System.abortJob(jobId); 
        Monitoring.scheduleJob();
    } 
} 

以下是Salesforce Secure Coding参考,

您可能还想尝试这种类型的循环以遍历查询结果的每一项 https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_loops_for_SOQL.htm

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...