Saya membuat aplikasi Electron untuk tujuan saya sendiri. Masalah saya adalah ketika saya menggunakan fungsi node di dalam halaman HTML saya, kesalahan itu muncul:
'require ()' tidak ditentukan.
Apakah ada cara untuk menggunakan fungsionalitas Node di semua halaman HTML saya? Jika memungkinkan tolong beri saya contoh bagaimana melakukan ini atau berikan tautan. Berikut adalah variabel yang saya coba gunakan di halaman HTML saya:
var app = require('electron').remote;
var dialog = app.dialog;
var fs = require('fs');
dan ini adalah nilai yang saya gunakan di semua jendela HTML saya di dalam Electron.
javascript
html
node.js
electron
Mari Selvan
sumber
sumber
Jawaban:
Pada versi 5, default untuk
nodeIntegration
diubah dari benar menjadi salah. Anda dapat mengaktifkannya saat membuat Jendela Browser:sumber
nodeIntegration: true
adalah risiko keamanan hanya jika Anda menjalankan beberapa kode jarak jauh yang tidak tepercaya pada aplikasi Anda. Misalnya, aplikasi Anda membuka halaman web pihak ketiga. Itu akan menjadi risiko keamanan karena halaman web pihak ketiga akan memiliki akses ke runtime node dan dapat menjalankan beberapa kode berbahaya pada sistem file pengguna Anda. Dalam hal ini masuk akal untuk mengaturnodeIntegration: false
. Jika aplikasi Anda tidak menampilkan konten jarak jauh apa pun, atau hanya menampilkan konten tepercaya, setelannodeIntegration: true
tidak apa-apa.Untuk alasan keamanan, Anda harus menyimpan
nodeIntegration: false
dan menggunakan skrip pramuat untuk mengekspos apa yang Anda butuhkan dari Node / Electron API ke proses renderer (tampilan) melalui variabel jendela. Dari dokumen Electron :Contoh
main.js
preload.js
renderer.js
sumber
<script src="./renderer.js"></script>
Saya harap jawaban ini mendapat perhatian, karena sebagian besar jawaban di sini meninggalkan lubang keamanan besar di aplikasi elektron Anda. Sebenarnya jawaban ini pada dasarnya adalah apa yang harus Anda lakukan untuk digunakan
require()
dalam aplikasi elektron Anda. (Hanya ada API elektron baru yang membuatnya sedikit lebih bersih di v7).Saya menulis penjelasan / solusi terperinci di github menggunakan api elektron terbaru tentang bagaimana Anda dapat melakukan
require()
sesuatu, tetapi saya akan menjelaskan secara singkat di sini mengapa Anda harus mengikuti pendekatan menggunakan skrip preload, contextBridge, dan ipc.Masalah
Aplikasi elektron sangat bagus karena kita bisa menggunakan node, tetapi kekuatan ini adalah pedang bermata dua. Jika kami tidak berhati-hati, kami memberi seseorang akses ke node melalui aplikasi kami, dan dengan node, aktor jahat dapat merusak mesin Anda atau menghapus file sistem operasi Anda (antara lain, saya bayangkan).
Seperti apa masalahnya
Masalah ini terwujud ketika Anda (salah satu dari yang di bawah ini):
nodeIntegration:true
diaktifkanremote
modulSemua masalah ini memberikan akses tanpa gangguan ke node dari proses perender Anda. Jika proses perender Anda pernah dibajak, Anda dapat menganggap semuanya hilang.
Apa solusi kami
Solusinya adalah tidak memberikan perender akses langsung ke node (mis.
require()
), Tetapi memberikan akses proses utama elektron kamirequire
, dan kapan pun proses penyaji kami perlu menggunakanrequire
, marshal permintaan ke proses utama.Cara ini bekerja di versi terbaru (7+) dari Electron ada di sisi penyaji kami mengatur ikatan ipcRenderer , dan di sisi utama kami mengatur ikatan ipcMain . Di binding ipcMain kami menyiapkan metode listener yang menggunakan modul we
require()
. Ini bagus dan bagus karena proses utama kami dapatrequire
semua yang diinginkannya.Kami menggunakan contextBridge untuk meneruskan ikatan ipcRenderer ke kode aplikasi kami (untuk digunakan), dan ketika aplikasi kami perlu menggunakan
require
modul d di main, itu mengirim pesan melalui IPC (antar-proses-komunikasi) dan proses utama berjalan beberapa kode, dan kami kemudian mengirim pesan kembali dengan hasil kami.Secara kasar , inilah yang ingin Anda lakukan.
main.js
preload.js
index.html
Penolakan
Saya penulis
secure-electron-template
, templat aman untuk membangun aplikasi elektron. Saya peduli dengan topik ini, dan telah mengerjakannya selama beberapa minggu (pada saat ini).sumber
nodeIntegration
mencegah pengguna secara tidak sengaja atau sengaja menyebabkan kerusakan pada diri mereka sendiri saat menggunakan aplikasi, dan merupakan perlindungan ekstra jika beberapa malware melekat pada proses elektron Anda dan dapat melakukan XSS dengan mengetahui vektor ini terbuka (luar biasa jarang, tapi di situlah otak saya pergi)!Apakah Anda menggunakan
nodeIntegration: false
saat inisialisasi BrowserWindow? Jika demikian, setel ketrue
(nilai default adalahtrue
).Dan sertakan skrip eksternal Anda dalam HTML seperti ini (bukan sebagai
<script> src="./index.js" </script>
):sumber
var pdfjsLib = require('pdfjs-dist')
dan menggunakannya dengan cara ini.require
daripada<script src="..."></script>
? Ini juga memiliki pertanyaan yang belum terjawab di sini .Pertama, solusi @Sathiraumesh meninggalkan aplikasi elektron Anda dengan masalah keamanan yang sangat besar. Bayangkan aplikasi Anda menambahkan beberapa fitur tambahan
messenger.com
, misalnya ikon bilah alat akan berubah atau berkedip ketika Anda memiliki pesan yang belum dibaca. Jadi dimain.js
file Anda, Anda membuat BrowserWindow baru seperti itu (perhatikan saya sengaja salah mengeja messenger.com):Bagaimana jika
messengre.com
situs web berbahaya, yang ingin merusak komputer Anda. Jika Anda menyetelnodeIntegration: true
situs ini memiliki akses ke sistem file lokal Anda dan dapat menjalankan ini:Dan direktori home Anda hilang.
Solusi Tampilkan
hanya apa yang Anda butuhkan, alih-alih semuanya. Ini dicapai dengan memuat kode javascript dengan
require
pernyataan.Sekarang mengerikan
messengre.com
tidak dapat menghapus seluruh sistem file Anda.sumber
Akhirnya, saya berhasil. Tambahkan kode ini ke Elemen Skrip dokumen HTML Anda.
Maaf atas balasan terlambat. Saya menggunakan kode di bawah ini untuk melakukan hal ini.
Dan gunakan
nodeRequire
alih-alih menggunakanrequire
.Ini bekerja dengan baik.
sumber
Anda harus mengaktifkan nodeIntegration di webPreferences untuk menggunakannya. Lihat di bawah,
Ada perubahan api yang merusak elektron 5.0 ( Pengumuman tentang Repositori ). Dalam versi terbaru nodeIntegration secara default disetel ke false .
Tetapi jika Anda ingin mempertahankan kemampuan untuk menggunakan Node.js dan Electron API, Anda harus mengganti nama simbol di halaman sebelum memasukkan pustaka lain:
sumber