Второй порядок SOQL SOSL Injection 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.

Спасибо


person Gourav Saini    schedule 21.08.2020    source источник
comment
Кажется, здесь не хватает информации. Важно знать, что SQL-инъекция второго порядка — это тот случай, когда мы считываем информацию из базы данных. Якобы база данных является внутренней, и поэтому информация в ней верна, но тем не менее в ней может быть безвредная информация, но в сочетании с чтением информации и ее использованием может быть уязвима.   -  person baruchiro    schedule 23.08.2020
comment
@baruchiro какая еще информация тебе нужна?   -  person Gourav Saini    schedule 24.08.2020


Ответы (1)


Используйте метод 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

person securecodeninja    schedule 24.08.2020
comment
public static void abortJob() { list‹CronTrigger› detailId = [выберите идентификатор FROM CronTrigger, где (CronJobDetail.Name = 'myJobName') AND NextFireTime = null]; //строка 212 Id jobId ; for (CronTrigger currentCron: detailId) { jobId = String.escapeSingleQuotes(currentCron.Id); } if (jobId !=null) { System.abortJob(jobId); Мониторинг.scheduleJob(); } } - person Gourav Saini; 24.08.2020