Разве JavaScript setTimeout и setInterval не имеют потенциальной уязвимости безопасности - PullRequest
4 голосов
/ 12 января 2012

Ну, это не огромный риск для безопасности, хотя, по крайней мере, он обнаруживает потенциальные помехи.

Предположим, у нас есть очень хорошо закрытые модули JavaScript, которые загружаются на мою страницу, не зная друг о друге.Они из "доверенных", однако некоторые разработчики в lib2 допустили ошибку, см. Код.

Lib1 http://good.site/libs/the-famous-important-lib1.js

setInterval(function(){
   alert('I am doing some important stuff');
}, 1000);

Lib2 http://not-excelent.site/libs/the-cool-lib2.js

var i = setInterval(function(){}, 0);
for(; i >= 0; i-=1) {
    clearInterval(i);
}

Мой HTML

<script src="http://good.site/libs/the-famous-important-lib1.js" type="text/javascript"></script>
<script src="http://not-excelent.site/libs/the-cool-lib2.js" type="text/javascript"></script>

В браузере или, по крайней мере, в Firefox, загрузка Lib2 фактически полностью сломает Lib1.Некоторые могут сказать, что это не важно, и как глупо совершать такую ​​ошибку.

Я считаю это плохим поведением.Так как мы загружаем все больше сторонних библиотек на наших сайтах.Возможно, правильное решение состоит в том, что setInterval и setTimeout должны возвращать Ojbect, чтобы он был действительно уникальным и не поддающимся изменению, а не просто числовым идентификатором автоматического увеличения.

Кто-то может столкнуться с реальным миромиспользование для этого (все еще не проверял, является ли это кросс-кадрами, я сомневаюсь в этом на самом деле).

Вопрос: Это так?и строгий режим в es5 преодолевает это?

Ответы [ 2 ]

3 голосов
/ 12 января 2012

Преодолевает ли строгий режим в es5 это?

Нет. setInterval и setTimeout являются частью привязок DOM - они не являются встроенными компонентами EcmaScript, поэтому они не указаны ни в одной версии EcmaScript. Ничто в строгом режиме не влияет на них.

Это, вероятно, изменится в следующей версии EcmaScript, так как комитет TC39 считает, что параллелизм является основной функцией языка, которую необходимо указать, и, вероятно, сохранит параллелизм цикла событий .

Эти изменения вряд ли повлияют на проблему, которую вы поднимаете. Caja / Secure EcmaScript (SES) действительно гарантирует, что идентификаторы интервалов и тайм-аутов не являются вероятными.

3 голосов
/ 12 января 2012

Интересный момент.

Поскольку идентификаторы интервалов / тайм-аутов являются последовательными, вы можете (как вы показали нам) очистить все интервалы / тайм-ауты, получив себе следующий идентификатор интервала, а затем попытаться стереть любые идентификаторы, меньшие, чем у вас.

Однако я не вижу никакой угрозы безопасности . Любое веб-приложение, которое основывало бы свою безопасность исключительно на интервале и / или тайм-ауте в Javascript, так или иначе взломано.

Как уже прокомментировал Серхио Туленцев, злоупотребление clearInterval / clearTimeout наверняка сломает что-то, но (99% времени) это не будет представлять угрозу безопасности для веб-приложения.

...