При запуске пользователя, введенного Javascript, есть ли способ обнаружить и остановить "проблемные" сценарии?

На странице что-то вроде jsFiddle, который выполняет введенный пользователем Javascript, есть способ остановить/нарушить "проблемные" скрипты, запущенные в iframe?

Я думаю, что основным классом проблемных скриптов будет бесконечный цикл. Браузеры справляются с несколькими предупреждениями довольно хорошо, но script like, ​for (var i = 0; ++i; i < 100) { /* do stuff */ }​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ будет навсегда.

Как я могу либо обнаруживать, либо не запускать, а запускать и останавливаться, скажем, через 10 секунд работы, script?

Удаление iframe в порядке, но я хочу удалить его только в том случае, если script все еще работает через 10 секунд, но я не хочу его удалять, если script перестает работать.


Вот как я думаю, что страница будет работать. Если у вас есть лучшее решение, дайте мне знать...

Страница ввода содержит textarea и пробел iframe. Пользователь вводит их script в textarea, и когда они готовы, они нажимают на run. Затем (за кулисами) создается отдельная страница, содержащая пользователя script в исполняемой форме на HTML-странице. src iframe устанавливается на страницу с исполняемым кодом. Все это происходит динамически без обновления страницы.

Ответ 1

Я не использовал этот jsandbox script, но он, похоже, имеет то, что вы хотите.

Ответ 2

Если один script зависает на странице, другие скрипты не будут продолжать работать. Поэтому невозможно обнаружить, что другой script остановился, не используя собственный плагин или что-то в этом роде. Таким образом, браузеры не используют многопоточность.

Ответ 3

Вы можете установить таймаут в главном окне, которое останавливает/удаляет script через 10 секунд. Затем вам просто нужно очистить таймаут, когда закончится script (просто добавьте строку, подобную этой, в iframe script: window.frames[0].clearTimeout(window.frames[0].timeoutName) - я не знаю, работает ли она, но она должна)

Ответ 4

Я думаю, что это будет во многом зависеть от script и того, как браузеры обрабатывают скрипты в iframe.

Скажем, есть какое-то время (true) в iframe.

Браузер может либо заблокировать, либо сломать вкладку (например, что делает Chrome), либо заблокировать iframe. Если он заблокирует или сбрасывает вкладку, вы ничего не можете сделать с самим JS, чтобы предотвратить ее, кроме попытки статического анализа на script найти возможные проблемные заявления (статический анализ для поиска проблемных скриптов, подобных тому, который никогда не будет надежным)

Предполагая, что браузер блокирует iframe или делает что-то еще, все еще позволяя сценариям на главной странице делать что-либо, удаление iframe через определенный период времени является опцией.

В браузере также может отображаться всплывающее окно "Script is slow". В этом случае он, скорее всего, полностью отключит все сценарии на вкладке цели или только в iframe. Если только iframe, другие скрипты на вкладке могут быть очищены после него через предопределенный период времени.

Другой альтернативой может быть предварительная оценка script в отдельной среде выполнения, где вы можете самостоятельно обнаружить такие вещи. Вы можете запустить script в, скажем, Rhino, и определить, требуется ли слишком много времени для обработки или что-то подобное.

Ответ 5

Я не знаю, будет ли это работать точно, вы можете получить что-то вроде этого, чтобы немного поработать. Я полагаю, что вы принимаете текст JavaScript, а затем угадываете его, не так ли? Вы могли бы анализировать или даже просто использовать регулярное выражение для замены всех вызовов for, for..in, while и function с вызовом функции, а затем на какую-то логику, которая вызывает ваш код и вычисляет, если он работает в течение 10 секунд. Если он будет, он либо вернется; или break; или что-то еще. После этого код, скорее всего, выйдет из себя и, вероятно, начнет метать ошибки, но по крайней мере script остановится.