Тайм-аут JS вызывает исключение eval

#settimeout #eval #content-security-policy

#settimeout #оценка #контент-безопасность-политика #eval #контент-политика безопасности

Вопрос:

По какой-то причине один из моих JS-файлов вызывает unsafe-eval нарушение Политики безопасности контента на моем сайте. Мне это показалось странным, потому что нигде в файле этого нет eval() . Ошибка возникает в следующей строке:

 setTimeout(callSpecific(), (lengthMF * (number.length   2)));
  

Единственное, что я вижу здесь, — это арифметика в RHS, которая устанавливает значение таймаута. Итак, я попытался:

 setTimeout(callSpecific(), (parseInt(lengthMF) * (parseInt(number.length)   2)));
  

То же самое. Сами переменные даже не являются строками — они определяются как:

 var lengthMF = 150;
var number = ""; // yes, this is a string but number.length is not!
  

Почему это вызывает нарушение CSP? У меня есть другие setTimeout() на странице, и это, кажется, единственная проблема. Странная вещь заключается в том, что временная замена арифметического выражения константой (например, 50 ) не приводит к исчезновению проблемы.

Если это необходимо, callSpecific() выглядит примерно так:

 function callSpecific() {
    if (number == 0) {
        operatorRing();
    } else if (number.length == 2 amp;amp; number.charAt(1) == 0) {
        playReorder();
    } else if (number.length == 3) {
        //
    } else if (number.length <7 || number.length > 11) {
        //
    } else if (number.length == 11 amp;amp; (number.charAt(4) == 1 || number.charAt(4) == 0)) {
        //
    }
}
  

Комментарии:

1. Вариант 1: Вы передаете callSpecific() , который вызывался раньше setTimeout() , и потому, что number == 0 , operatorRing() вызывает некоторые забавные вещи.

2. Вариант 2: Каким-то образом callSpecific() возвращает строку, что означает, что, когда придет время запускать код, eval() будет вызвана эта строка.

3. @root К сожалению, ни то, ни другое не так. В моем тестировании number не было 0, и callSpecific() фактически ничего не возвращает

4. callSpecific() ничего не возвращает (т. е. undefined )? Значит, вы ничего не передаете на setTimeout() исполнение?