eval в пакетном приложении Chrome

Я хотел бы создать расширение chrome для пакетного приложения, чтобы пользователь мог писать и выполнять код javascript (например, консоль javascript).

Я хотел бы использовать функцию eval() для выполнения кода JS.

Классическая функция javascript eval выдает ошибку при вызове из расширения Chrome:

Неперехваченная ошибка: генерация кода из строк запрещена для этого контекста

Чтобы использовать eval в расширении Chrome, нужно использовать песочницу, но когда я пишу песочницу в манифест я получаю эту ошибку:

При попытке установить это расширение были предупреждения: «песочница» не разрешена для указанного типа пакета (тема, приложение и т. д.).

ОБНОВЛЕНИЕ

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

  1. Есть ли другой метод, который я могу использовать вместо eval()?

  2. Можно ли использовать eval без песочницы? (думаю наверное не из соображений безопасности?)


person Charles    schedule 10.08.2012    source источник
comment
Я мало что знаю об этом, но использование js.js может< /i> быть возможным (хотя и менее производительным) решением.   -  person apsillers    schedule 12.08.2012


Ответы (6)


Я полагаю, вы говорите о новом упакованном приложении (версия манифеста 2), верно?

Песочницы можно использовать в новых пакетных приложениях. На прошлой неделе я только что загрузил пример, который делает именно это : Окно отправляет сообщение скрытому изолированному iframe, iframe компилирует шаблон руля (вместо этого можно использовать eval) и возвращает скомпилированный HTML-код на страницу хостинга, которая показывает результат.

Вы также можете проверить другой пример, который делает именно то, что вы хотите.

Итак, чтобы напрямую ответить на ваши вопросы:

1) Нет, из-за ограничений CSP. Единственный способ оценить динамический JavaScript в упакованных приложениях Chrome — это изолированный iframe. Если это не вариант для вашего приложения, вы также можете отправить и оценить содержимое JavaScript на своем сервере и вернуть пользователю только результаты (хотя это нарушает автономную функцию упакованных приложений Chrome).

2) Нет, вы можете использовать eval() только в изолированном iframe.

person mangini    schedule 14.08.2012
comment
Обе ссылки битые - person asdjfiasd; 13.03.2015
comment
Фиксированный. Репозиторий Github был переработан, что привело к недопустимым URL-адресам. - person mangini; 16.03.2015

Вы могли бы попробовать...

function evalMe(code){
    var script = document.createElement('script');
    script.innerText = code;
    document.querySelector('head').appendChild(script);
}

Это должно создать тот же эффект, если они также не отключили его, но, насколько мне известно, это нормально. Конечно, если сценарий errors, вы не услышите об этом, если не сделаете перенос string в eval, например.

function myHandler(err){
    // handle errors.   
}

function evalMe(code){
    var script = document.createElement('script');
    var wrapper = '(function(){ try{ @@ }catch(err){ myHandler(err); } })()';
    // Make sure the string has an ending semicolon
    code = code[code.length-1] === ';' ? code : code + ';';

    script.innerText = wrapper.replace('@@', code);
    document.querySelector('head').appendChild(script);
}

В качестве альтернативы вы можете использовать официальный механизм

http://developer.chrome.com/beta/extensions/tabs.html#method-executeScript

Однако для этого вам потребуется фоновая страница и использование передача сообщений между вашей app страницей и фоновой страницей.

ОБНОВЛЕНИЕ: метод работы

Вы можете создать eval подобный метод, используя iframe и base64 закодированный dataURI, который обрабатывает передачу сообщений между страницей расширения и <iframe>. Вы можете получить рабочую копию кода на github. Чтобы использовать, просто клонируйте или загрузите репозиторий и установите «клиент» dir как неупакованное расширение в диспетчере расширений Chrome. Код, управляющий плагином, находится в app.js.

Используйте iframeEval для проверки, уведомление об ошибке немного глючит, но eval работает.

@appsillers Чтобы ваш плагин работал без дополнительного кода, вы можете перезаписать метод eval в своих расширениях window методом iframeEval в коде.

person AshHeskes    schedule 14.08.2012
comment
manifest_version: 2 запрещает встроенные скрипты, поэтому я ожидаю, что evalMe вызовет ошибку, потому что он внедряет <script> со встроенным скриптом. Ваше последнее предложение о передаче сообщения для выполнения executeScript в фоновом режиме является интересной возможностью, но я думаю, что оно может быть ограничено отдельной средой выполнения, как и фоновые страницы. Я проверю, правильно ли это. - person apsillers; 14.08.2012
comment
Я только что проверил свою первую точку, и evalMe выдает ошибку Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:". - person apsillers; 14.08.2012
comment
хм, позвольте мне еще немного покопаться в документах. Как вопрос, требуют ли оцениваемые скрипты доступ к страницам DOM? или они pure.js - person AshHeskes; 14.08.2012
comment
Я предполагаю, что нет, иначе eval было бы довольно опасно, поскольку вы даете eval коду разрешение на доступ к API Chrome. Если это не ваше намерение - person AshHeskes; 14.08.2012

Я пришел к этому ответу после того, как приложение Chrome Angular.js, которое я запускал, дало ту же ошибку. Автор не упомянул Angular.js, но если кто-то еще столкнется с этим, вам нужно добавить дополнительную директиву на свою веб-страницу, например.

<html ng-app ng-csp>
...

Это помещает angular в безопасный режим CSP https://docs.angularjs.org/api/ng/directive/ngCsp

person rob    schedule 22.05.2015

Вы можете использовать: $scope.$eval() из angular.

person Gabriel Bazán    schedule 20.07.2016
comment
Добро пожаловать в StackOverflow. Вам, вероятно, следует несколько уточнить свой вопрос: вы проверяли это или у вас есть некоторый опыт, или вы просто подкинули идею, которая пришла вам в голову? Хотя последнее тоже может быть в порядке, более подробные ответы приветствуются. Кроме того, пожалуйста, используйте обертки кода. С наилучшими пожеланиями. - person YakovL; 20.07.2016

Вот пример того, что НЕ будет работать, так как все строки с кодом будут отклонены в упакованных приложениях Chrome:

//To run some code from a string without `eval` just do this:
var code = new Function(yourCodeString);
code();
person elclanrs    schedule 10.08.2012
comment
спасибо, но та же проблема: неперехваченная ошибка: генерация кода из строк запрещена для этого контекста - person Charles; 10.08.2012
comment
Не знаю... Возможно, вы правы, может быть, это проблема безопасности, и они отключили ее. - person elclanrs; 10.08.2012
comment
Политика безопасности контента запрещает любую генерацию динамического кода в расширениях Chrome — будь то eval() или new Function(). - person Wladimir Palant; 10.08.2012
comment
Вот ссылка на документацию по этому вопросу, в которой показаны примеры, демонстрирующие, что любое строковое вычисление JavaScript не поддерживается. developer.chrome.com/extensions/contentSecurityPolicy.html. Рассмотрите возможность внесения редактирования в свое сообщение, чтобы исправить неточности, или рассмотрите возможность его удаления. Удачи! :) - person jmort253; 06.10.2012
comment
Итак, я подумал, что ваш пост был хорошим примером того, что не будет работать, и тот факт, что он здесь, проясняет некоторые моменты о том, как далеко Google готов зайти, чтобы обеспечить нашу безопасность. ;), поэтому я отредактировал ваш пост, чтобы сделать его правильным и по-прежнему полезным для будущих посетителей, сохранив суть вашего ответа. Надеюсь это поможет! +1 - person jmort253; 10.10.2012

person    schedule
comment
Вы можете обновить свой ответ, упомянув директиву unsafe-eval, developer.chrome.com/extensions / - person Rob W; 26.06.2013
comment
Убедитесь, что вы перезагрузили расширение после добавления его в manifest.json. - person Jason Kim; 25.01.2014
comment
Я просто хочу добавить, что этот метод работает только для расширений, а не для упакованных приложений (поскольку название темы относится к упакованным приложениям). - person Patricia Garcia; 21.10.2014
comment
@PatriciaGarcia Интересно, да - путаница здесь, кажется, заключается в том, что термин «упакованное приложение» относится к двум совершенно разным вещам, а связанный отчет об ошибке OP относится к устаревшим упакованным приложениям, которые в основном являются расширениями приложения. значок экрана. Однако вполне вероятно, что ОП не понял этого в отчете об ошибке (я тоже) и на самом деле имел в виду современные упакованные приложения. Спасибо за указание на это; Я посмотрю, смогу ли я приложить усилия, чтобы уточнить этот ответ в ближайшее время. - person apsillers; 21.10.2014