Я создаю приложение Electron для своих собственных целей. Моя проблема в том, что когда я использую функции узла внутри своей HTML-страницы, возникает ошибка:
'require ()' не определен.
Есть ли способ использовать функции узла на всех моих HTML-страницах? Если возможно, дайте мне пример, как это сделать, или дайте ссылку. Вот переменные, которые я пытаюсь использовать на своей HTML-странице:
var app = require('electron').remote;
var dialog = app.dialog;
var fs = require('fs');
и это значения, которые я использую во всех своих окнах HTML в Electron.
javascript
html
node.js
electron
Мари Селван
источник
источник
Ответы:
Начиная с версии 5, значение по умолчанию для
nodeIntegration
изменено с true на false. Вы можете включить его при создании окна браузера:источник
nodeIntegration: true
представляет собой угрозу безопасности только тогда, когда вы выполняете ненадежный удаленный код в своем приложении. Например, предположим, что ваше приложение открывает стороннюю веб-страницу. Это было бы угрозой безопасности, потому что сторонняя веб-страница будет иметь доступ к среде выполнения узла и может запускать вредоносный код в файловой системе вашего пользователя. В таком случае имеет смысл установитьnodeIntegration: false
. Если ваше приложение не отображает какой-либо удаленный контент или отображает только доверенный контент, тогда настройкаnodeIntegration: true
в порядке.По соображениям безопасности вы должны сохранить
nodeIntegration: false
и использовать сценарий предварительной загрузки, чтобы предоставлять только то, что вам нужно от Node / Electron API, процессу визуализации (представлению) через переменную окна. Из документов Electron :пример
main.js
preload.js
renderer.js
источник
<script src="./renderer.js"></script>
Я надеюсь, что этот ответ привлечет некоторое внимание, потому что подавляющее большинство ответов здесь оставляют большие дыры в безопасности в вашем электронном приложении. Фактически, этот ответ - это то, что вы должны делать, чтобы использовать
require()
в своих электронных приложениях. (Есть только новый электронный API, который делает его немного чище в версии 7).Я написал подробное объяснение / решение в github, используя самый последний электронный API того, как вы можете
require()
что-то сделать, но я кратко объясню здесь, почему вы должны следовать подходу с использованием сценария предварительной загрузки, contextBridge и ipc.Эта проблема
Приложения Electron великолепны, потому что мы можем использовать узел, но эта сила - палка о двух концах. Если мы не будем осторожны, мы дадим кому-то доступ к узлу через наше приложение, и с помощью узла злоумышленник может повредить вашу машину или удалить файлы вашей операционной системы (среди прочего, я полагаю).
Как выглядит проблема
Эта проблема проявляется, когда вы (любой из перечисленных ниже):
nodeIntegration:true
включенremote
модульВсе эти проблемы обеспечивают непрерывный доступ к узлу из вашего процесса рендеринга. Если ваш процесс рендеринга когда-либо будет взломан, вы можете считать, что все потеряно.
Какое у нас решение
Решение состоит в том, чтобы не давать рендереру прямой доступ к узлу (т. Е.
require()
), А предоставить нашему электронному основному процессу доступrequire
и в любое время, когда нашему процессу рендеринга потребуется его использоватьrequire
, маршалировать запрос к основному процессу.В последних версиях (7+) Electron это работает так: на стороне рендерера мы настраиваем привязки ipcRenderer , а на основной стороне мы настраиваем привязки ipcMain . В привязках ipcMain мы настраиваем методы прослушивателя, которые используют модули, которые мы
require()
. Это нормально, потому что наш основной процесс можетrequire
все, что угодно.Мы используем contextBridge для передачи привязок ipcRenderer к коду нашего приложения (для использования), и поэтому, когда нашему приложению необходимо использовать
require
модули d в основном, оно отправляет сообщение через IPC (межпроцессное взаимодействие) и запускается основной процесс. какой-то код, а затем мы отправляем сообщение с нашим результатом.Примерно вот что вы хотите сделать.
main.js
preload.js
index.html
Отказ от ответственности
Я автор
secure-electron-template
безопасного шаблона для создания электронных приложений. Мне небезразлична эта тема, и я работаю над ней несколько недель (на данный момент).источник
nodeIntegration
предотвращает случайное или преднамеренное нанесение пользователем вреда себе при использовании приложения и является дополнительной защитой в случае, если какое-то вредоносное ПО было подключено к вашему электронному процессу и могло выполнить XSS, зная, что этот вектор был открыт (невероятно редко, но вот куда ушел мой мозг)!Вы используете
nodeIntegration: false
при инициализации BrowserWindow? Если это так, установите его наtrue
(значение по умолчаниюtrue
).И включите свои внешние скрипты в HTML следующим образом (не как
<script> src="./index.js" </script>
):источник
var pdfjsLib = require('pdfjs-dist')
и использовать его таким образом.require
вместо<script src="..."></script>
? Это также остающийся без ответа вопрос здесь .Во-первых, решение @Sathiraumesh оставляет ваше электронное приложение с огромной проблемой безопасности. Представьте, что ваше приложение добавляет некоторые дополнительные функции
messenger.com
, например, значок на панели инструментов будет меняться или мигать, когда у вас есть непрочитанное сообщение. Итак, в вашемmain.js
файле вы создаете новое окно BrowserWindow следующим образом (обратите внимание, я намеренно неправильно написал messenger.com):Что, если
messengre.com
это вредоносный веб-сайт, который хочет нанести вред вашему компьютеру. Если вы установитеnodeIntegration: true
этот сайт, он имеет доступ к вашей локальной файловой системе и может выполнить это:И вашего домашнего каталога больше нет.
Решение
Выставляйте только то, что вам нужно, а не все. Это достигается за счет предварительной загрузки кода javascript с
require
операторами.Теперь ужасно
messengre.com
невозможно удалить всю файловую систему.источник
Наконец, я заставил это работать. Добавьте этот код в свой HTML-документ Script Element.
Извините за поздний ответ. Для этого я использую приведенный ниже код.
И используйте
nodeRequire
вместо использованияrequire
.Работает нормально.
источник
Вы должны включить nodeIntegration в webPreferences, чтобы использовать его. увидеть ниже,
Произошли критические изменения api в электронном 5.0 ( Объявление в репозитории ). В последних версиях для nodeIntegration по умолчанию установлено значение false .
Но если вы хотите сохранить возможность использования API-интерфейсов Node.js и Electron, вам необходимо переименовать символы на странице, прежде чем включать другие библиотеки:
источник