আমি আশা করি এই উত্তরটি কিছুটা মনোযোগ পেয়েছে, কারণ এখানে বিপুল সংখ্যাগরিষ্ট উত্তরগুলি আপনার ইলেক্ট্রন অ্যাপ্লিকেশনে বৃহত সুরক্ষা গর্ত ছেড়ে দেয় । আসলে এই উত্তরটিrequire()
আপনার ইলেক্ট্রন অ্যাপ্লিকেশনগুলিতে ব্যবহার করার জন্য আপনাকে কী করা উচিত তা মূলত is (এখানে কেবলমাত্র একটি নতুন ইলেক্ট্রন এপিআই রয়েছে যা এটি ভি 7 এ কিছুটা পরিষ্কার করে তোলে)।
আপনি কীভাবে কিছু করতে পারেন তার সর্বাধিক বর্তমান ইলেকট্রন এপিএস ব্যবহার করে আমি গিথুবে একটি বিস্তারিত ব্যাখ্যা / সমাধান লিখেছি require()
, তবে আমি এখানে সংক্ষেপে ব্যাখ্যা করব কেন আপনার একটি প্রিললোড স্ক্রিপ্ট, কনটেক্সট ব্রিজ এবং আইপিসি ব্যবহার করে কেন একটি পদ্ধতির অনুসরণ করা উচিত।
সমস্যাটি
ইলেক্ট্রন অ্যাপ্লিকেশন দুর্দান্ত কারণ আমরা নোড ব্যবহার করতে পারি তবে এই শক্তিটি একটি দ্বি-তরোয়াল তরোয়াল। আমরা যদি সাবধান না হন তবে আমরা কাউকে আমাদের অ্যাপের মাধ্যমে নোডের অ্যাক্সেস দিয়ে থাকি এবং নোডের সাহায্যে একজন খারাপ অভিনেতা আপনার মেশিনকে দূষিত করতে পারে বা আপনার অপারেটিং সিস্টেমের ফাইলগুলি মুছে ফেলতে পারে (অন্যান্য জিনিসগুলির মধ্যে, আমি কল্পনাও করি)।
@Raddevus দ্বারা একটি মন্তব্যে যেমন উত্থাপিত হয়েছে, দূরবর্তী সামগ্রী লোড করার সময় এটি প্রয়োজনীয় । যদি আপনার ইলেক্ট্রন অ্যাপ সম্পূর্ণরূপে অফলাইন / স্থানীয় হয় তবে আপনি সম্ভবত ঠিক চালু করছেন । তবুও আমি আপনার অ্যাপ্লিকেশনটি ব্যবহার করে দুর্ঘটনাজনিত / দূষিত ব্যবহারকারীদের জন্য সুরক্ষার কাজ হিসাবে কাজ করা বেছে নেব এবং আপনার ইলেকট্রন অ্যাপ্লিকেশনটির সাথে ইন্টারঅ্যাক্ট করতে এবং আক্রমণকারী ভেক্টর ব্যবহার থেকে আপনার মেশিনে ইনস্টল হওয়া কোনও সম্ভাব্য ম্যালওয়ারকে আটকাতে পারি (অবিশ্বাস্যভাবে বিরল , কিন্তু ঘটতে পারে)!nodeIntegration:true
nodeIntegration:false
nodeIntegration:true
সমস্যাটি দেখতে কেমন লাগে
আপনি (নীচের যে কোনও একটি) এই সমস্যাটি প্রকাশ পায়:
- হয়েছে
nodeIntegration:true
সক্রিয়
remote
মডিউলটি ব্যবহার করুন
এই সমস্ত সমস্যাগুলি আপনার রেন্ডারকারী প্রক্রিয়া থেকে নোডকে নিরবচ্ছিন্ন অ্যাক্সেস দেয়। যদি আপনার রেন্ডারার প্রক্রিয়াটি সর্বদা হাইজ্যাক হয় তবে আপনি সমস্তটি হারিয়ে গেছে তা বিবেচনা করতে পারেন।
আমাদের সমাধান কি
সমাধানটি হ'ল রেন্ডারারকে নোডে সরাসরি অ্যাক্সেস না দেওয়া (অর্থাত্ require()
), তবে আমাদের ইলেক্ট্রনটির প্রধান প্রক্রিয়াটিতে অ্যাক্সেস দেওয়া require
এবং যে কোনও সময় আমাদের রেন্ডারার প্রক্রিয়াটি ব্যবহার করা দরকার require
, মার্শালকে মূল প্রক্রিয়াটির জন্য একটি অনুরোধ জানানো হয়।
ইলেক্ট্রন এর সর্বশেষ সংস্করণ (7+) এ যেভাবে কাজ করে তা আমরা ipcRenderer বাইন্ডিংগুলি সেট আপ করি এবং মূল দিকে আমরা ipcMain বাইন্ডিংগুলি সেট আপ করি । IpcMain বাইন্ডিংগুলিতে আমরা শ্রোতার পদ্ধতিগুলি সেট আপ করি যা আমরা মডিউল ব্যবহার করি require()
। এটি সূক্ষ্ম এবং ভাল কারণ আমাদের মূল প্রক্রিয়া require
এটি যা চায় তা করতে পারে।
আমরা ব্যবহার contextBridge আমাদের অ্যাপ্লিকেশন কোড (ব্যবহারের) এর ipcRenderer বাইন্ডিং পাস, এবং তাই আমাদের অ্যাপ্লিকেশন চাহিদা ব্যবহার করতে যখন require
প্রধান ঘ মডিউল, এটা আইপিসি (আন্ত প্রক্রিয়া-যোগাযোগ) এবং মূল প্রক্রিয়া রান এর মাধ্যমে একটি বার্তা পাঠায় কিছু কোড, এবং আমরা আমাদের ফলাফল সহ একটি বার্তা প্রেরণ করি।
মোটামুটিভাবে , আপনি যা করতে চান তা এখানে।
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>
অস্বীকৃতি
আমি এর লেখক secure-electron-template
, বৈদ্যুতিন অ্যাপ্লিকেশনগুলি তৈরির জন্য একটি সুরক্ষিত টেম্পলেট। আমি এই বিষয়টির বিষয়ে যত্নশীল, এবং কয়েক সপ্তাহ ধরে (সময়ের এই সময়ে) এটি নিয়ে কাজ করছি।