Tworzę aplikację Electron do własnych celów. Mój problem polega na tym, że kiedy używam funkcji węzłów na mojej stronie HTML, generuje błąd:
„require ()” nie jest zdefiniowana.
Czy istnieje sposób na wykorzystanie funkcji Node na wszystkich moich stronach HTML? Jeśli to możliwe, proszę podać przykład, jak to zrobić lub podać link. Oto zmienne, których próbuję użyć na mojej stronie HTML:
var app = require('electron').remote;
var dialog = app.dialog;
var fs = require('fs');
i to są wartości, których używam we wszystkich oknach HTML w Electron.
javascript
html
node.js
electron
Mari Selvan
źródło
źródło
Odpowiedzi:
Począwszy od wersji 5, wartość domyślna
nodeIntegration
zmieniła się z true na false. Możesz ją włączyć podczas tworzenia okna przeglądarki:źródło
nodeIntegration: true
stanowi zagrożenie bezpieczeństwa tylko wtedy, gdy wykonujesz niezaufany zdalny kod w swojej aplikacji. Na przykład załóżmy, że aplikacja otwiera stronę internetową innej firmy. Stanowiłoby to zagrożenie bezpieczeństwa, ponieważ strona internetowa strony trzeciej będzie miała dostęp do środowiska wykonawczego węzła i może uruchamiać złośliwy kod w systemie plików użytkownika. W takim przypadku warto ustawićnodeIntegration: false
. Jeśli Twoja aplikacja nie wyświetla żadnych zdalnych treści lub wyświetla tylko zaufane treści, ustawienienodeIntegration: true
jest prawidłowe.Ze względów bezpieczeństwa powinieneś zachować
nodeIntegration: false
i użyć skryptu wstępnego ładowania, aby udostępnić tylko to, czego potrzebujesz z Node / Electron API do procesu renderowania (widoku) za pośrednictwem zmiennej okna. Z dokumentów Electron :Przykład
main.js
preload.js
renderer.js
źródło
<script src="./renderer.js"></script>
Mam nadzieję, że ta odpowiedź przyciągnie trochę uwagi, ponieważ znaczna większość odpowiedzi pozostawia duże luki w zabezpieczeniach aplikacji electron. W rzeczywistości ta odpowiedź jest zasadniczo tym, co powinieneś zrobić, aby użyć
require()
w swoich aplikacjach electron. (Jest tylko nowe elektroniczne API, które sprawia, że jest trochę czystsze w wersji 7).Napisałem szczegółowe wyjaśnienie / rozwiązanie na githubie, używając najbardziej aktualnych elektronicznych
require()
interfejsów API, jak można coś zrobić, ale wyjaśnię tutaj pokrótce, dlaczego powinieneś zastosować podejście przy użyciu skryptu wstępnego ładowania, contextBridge i ipc.Problem
Aplikacje Electron są świetne, ponieważ używamy węzła, ale ta moc jest mieczem obosiecznym. Jeśli nie jesteśmy ostrożni, dajemy komuś dostęp do węzła za pośrednictwem naszej aplikacji, a przy użyciu węzła zły aktor może uszkodzić twój komputer lub usunąć pliki systemu operacyjnego (między innymi, jak mi się wydaje).
Jak wygląda problem
Ten problem objawia się, gdy (którykolwiek z poniższych):
nodeIntegration:true
włączoneremote
modułuWszystkie te problemy zapewniają nieprzerwany dostęp do węzła z procesu renderowania. Jeśli twój proces renderowania zostanie kiedykolwiek przejęty, możesz uznać, że wszystko jest stracone.
Jakie jest nasze rozwiązanie
Rozwiązaniem jest, aby nie dawać rendererowi bezpośredniego dostępu do węzła (tj.
require()
), Ale dać naszemu głównemu procesowi Electronowi dostęp dorequire
, i za każdym razem, gdy nasz proces renderowania potrzebujerequire
, zorganizować żądanie do głównego procesu.Sposób, w jaki to działa w najnowszych wersjach (7+) Electron, polega na tym, że po stronie renderera skonfigurowaliśmy wiązania ipcRenderer , a po stronie głównej skonfigurowaliśmy wiązania ipcMain . W powiązaniach ipcMain konfigurujemy metody nasłuchujące, które używają modułów my
require()
. Jest to w porządku i dobrze, ponieważ nasz główny proces może zrobićrequire
wszystko, czego chce.Używamy contextBridge do przekazywania powiązań ipcRenderer do naszego kodu aplikacji (do użycia), a więc gdy nasza aplikacja musi użyć
require
modułów d w main, wysyła wiadomość za pośrednictwem IPC (komunikacja między procesami) i proces główny działa trochę kodu, a następnie wysyłamy wiadomość zwrotną z naszym wynikiem.Z grubsza , oto co chcesz zrobić.
main.js
preload.js
index.html
Zrzeczenie się
Jestem autorem
secure-electron-template
bezpiecznego szablonu do tworzenia aplikacji Electron. Zależy mi na tym temacie i pracuję nad tym od kilku tygodni (w tym momencie).źródło
nodeIntegration
zapobiega przypadkowemu lub celowemu wyrządzeniu szkody użytkownikowi podczas korzystania z aplikacji i jest dodatkowym zabezpieczeniem na wypadek, gdyby jakieś złośliwe oprogramowanie zostało podłączone do twojego procesu elektronicznego i było w stanie wykonać XSS, wiedząc, że ten wektor był otwarty (niewiarygodnie rzadko, ale właśnie tam poszedł mój mózg)!Czy używasz
nodeIntegration: false
podczas inicjalizacji BrowserWindow? Jeśli tak, ustaw go natrue
(wartość domyślna totrue
).I dołącz swoje zewnętrzne skrypty do kodu HTML w następujący sposób (nie jako
<script> src="./index.js" </script>
):źródło
var pdfjsLib = require('pdfjs-dist')
i używać go w ten sposób.require
zamiast<script src="..."></script>
? Ma to również pytanie bez odpowiedzi tutaj .Po pierwsze, rozwiązanie @Sathiraumesh pozostawia Twoją aplikację elektronową z dużym problemem bezpieczeństwa. Wyobraź sobie, że Twoja aplikacja dodaje kilka dodatkowych funkcji
messenger.com
, na przykład ikona paska narzędzi zmienia się lub miga, gdy masz nieprzeczytaną wiadomość. Więc w swoimmain.js
pliku tworzysz nowe okno BrowserWindow w ten sposób (zauważ, że celowo błędnie napisałem messenger.com):Co zrobić, jeśli
messengre.com
jest to złośliwa witryna, która chce zaszkodzić Twojemu komputerowi. Jeśli ustawisz, żenodeIntegration: true
ta witryna ma dostęp do lokalnego systemu plików i może wykonać to:Twój katalog domowy zniknął.
Rozwiązanie Wyświetlaj
tylko to, czego potrzebujesz, zamiast wszystkiego. Osiąga się to poprzez wstępne ładowanie kodu JavaScript z
require
instrukcjami.Teraz okropne
messengre.com
nie może usunąć całego systemu plików.źródło
Wreszcie udało mi się. Dodaj ten kod do elementu skryptu dokumentu HTML.
Przepraszam za spóźnioną odpowiedź, używam poniższego kodu, aby to zrobić.
I używaj
nodeRequire
zamiast używaćrequire
.To działa dobrze.
źródło
Aby z niego korzystać, musisz włączyć opcję nodeIntegration w webPreferences . patrz poniżej,
Nastąpiła przełomowa zmiana API w elektronie 5.0 ( ogłoszenie w repozytorium ). W ostatnich wersjach nodeIntegration jest domyślnie ustawiony na false .
Ale jeśli chcesz zachować możliwość korzystania z Node.js i interfejsów API Electron, musisz zmienić nazwy symboli na stronie przed dołączeniem innych bibliotek:
źródło