Umarım bu yanıt biraz dikkat çeker, çünkü buradaki yanıtların büyük çoğunluğu elektron uygulamanızda büyük güvenlik açıkları bırakmaktadır . Aslında bu cevap , require()
elektron uygulamalarınızda kullanmak için yapmanız gereken şeydir . (Sadece v7'de onu biraz daha temiz yapan yeni bir elektron API'si var).
Github'da bir şeyi nasıl yapabileceğinize dair en güncel elektron apisini kullanarak ayrıntılı bir açıklama / çözüm yazdım require()
, ancak burada neden bir önyükleme betiği, contextBridge ve ipc kullanarak bir yaklaşımı izlemeniz gerektiğini kısaca açıklayacağım.
Sorun
Elektron uygulamaları harika çünkü düğümü kullanıyoruz, ancak bu güç iki ucu keskin bir kılıç. Dikkatli olmazsak, birisine uygulamamız aracılığıyla düğüme erişim izni veririz ve düğüm ile kötü bir aktör, makinenizi bozabilir veya işletim sistemi dosyalarınızı silebilir (diğer şeylerin yanı sıra, sanırım).
@Raddevus tarafından bir yorumda belirtildiği gibi, bu, uzak içerik yüklenirken gereklidir . Elektron uygulamanız tamamen çevrimdışı / yerel ise , o zaman muhtemelen basitçe açabilirsiniz . Yine de, uygulamanızı kullanan yanlışlıkla / kötü niyetli kullanıcılar için bir koruma önlemi olarak hareket etmeyi ve makinenize yüklenebilecek olası kötü amaçlı yazılımların elektron uygulamanızla etkileşime girmesini ve saldırı vektörünü (inanılmaz derecede nadir , ama olabilir)!nodeIntegration:true
nodeIntegration:false
nodeIntegration:true
Sorun neye benziyor
Bu sorun, siz (aşağıdakilerden herhangi biri):
- mü
nodeIntegration:true
etkin
remote
Modülü kullanın
Tüm bu sorunlar , oluşturucu işleminizden düğüme kesintisiz erişim sağlar. Oluşturucu işleminiz ele geçirilirse, her şeyin kaybolduğunu düşünebilirsiniz.
Bizim çözümümüz nedir
Çözüm, oluşturucuya düğüme (ör. ) Doğrudan erişim sağlamak require()
değil, elektron ana işlemimize erişim sağlamak require
ve oluşturucu işlemimizin kullanması gerektiğinde require
ana işlem için bir istek sıralamaktır.
Electron'un en son sürümlerinde (7+) bunun çalışma şekli oluşturucu tarafında ipcRenderer bağlamalarını kuruyoruz ve ana tarafta ipcMain bağlarını kuruyoruz . İpcMain bağlamalarında, modülleri kullandığımız dinleyici yöntemlerini kurarız require()
. Bu güzel ve iyi çünkü ana sürecimiz require
istediği her şeyi yapabilir .
Biz kullanmak contextBridge bizim uygulama koduna (kullanım için) ipcRenderer bağlamaları geçmek ve böylece bizim app ihtiyaçları ne zaman kullanılacağını require
ana d modülleri, bu IPC (süreçler arası-iletişim) ve ana süreç çalışır aracılığıyla bir mesaj gönderir bazı kodlar ve ardından sonucumuzla birlikte bir mesaj göndeririz.
Kabaca , işte yapmak istediğiniz şey.
main.js
const {
app,
BrowserWindow,
ipcMain
} = require("electron");
const path = require("path");
const fs = require("fs");
let win;
async function createWindow() {
win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
enableRemoteModule: false,
preload: path.join(__dirname, "preload.js")
}
});
win.loadFile(path.join(__dirname, "dist/index.html"));
}
app.on("ready", createWindow);
ipcMain.on("toMain", (event, args) => {
fs.readFile("path/to/file", (error, data) => {
win.webContents.send("fromMain", responseObj);
});
});
preload.js
const {
contextBridge,
ipcRenderer
} = require("electron");
contextBridge.exposeInMainWorld(
"api", {
send: (channel, data) => {
let validChannels = ["toMain"];
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
},
receive: (channel, func) => {
let validChannels = ["fromMain"];
if (validChannels.includes(channel)) {
ipcRenderer.on(channel, (event, ...args) => func(...args));
}
}
}
);
index.html
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8"/>
<title>Title</title>
</head>
<body>
<script>
window.api.receive("fromMain", (data) => {
console.log(`Received ${data} from main process`);
});
window.api.send("toMain", "some data");
</script>
</body>
</html>
Feragatname
Ben yazar değilim secure-electron-template
, yapı elektron uygulamalara güvenli bir şablon. Bu konuyu önemsiyorum ve birkaç haftadır bunun üzerinde çalışıyorum (bu noktada).