electron.js 和 sql - 正确的设置方法?
electron.js and sql - correct way to set it up?
我是 electron.js 的新手 - 一直在阅读文档和一些类似的 post 此处:
但如何正确实施安全 SQL 集成仍然不是很清楚。基本上,我想创建一个桌面数据库客户端。该应用程序将连接到远程数据库,用户可以 运行 所有类型的预定义查询,结果将显示在应用程序中。
文档说,如果您使用的是远程连接,则不应 运行 渲染器中的节点。然后我是否应该在主进程中请求 SQL 模块并使用 IPC 来回发送数据并预加载 IPCremote?
感谢帮助
简答:是
长答案:
在你的渲染器上允许节点会给你的应用带来很大的安全风险。在这种情况下,最好的做法是创建一个传递给预加载器的函数。您可以使用几个选项来执行此操作:
- 将包裹在另一个函数中的 ipcRenderer.invoke 函数传递给预加载中的渲染器。然后你可以调用你的主进程,它可以通过相同的函数发送回信息,或者通过 window.webContents.send 命令发送它并在你的 window api 上监听它渲染器。例如:
Preload.js:
const invoke = (channel, args, cb = () => {return}) => {
ipcRenderer.invoke(channel, args).then((res) => {
cb(res);
});
};
const handle = (channel, cb) => {
ipcRenderer.on(channel, function (Event, message) {
cb(Event, message);
});
};
contextBridge.exposeInMainWorld("GlobalApi", {
invoke: invoke,
handle:handle
});
渲染器:
let users
window.GlobalApi.handle("users", (data)=>{users=data})
window.GlobalApi.invoke("get", "users")
或:
let users;
window.GlobalApi.invoke("get", "users", (data)=>{users=data})
主要:
ipcMain.handle("get", async (path) => {
let data = dbFunctions.get(path)
window.webContents.send(
path,
data
);
}
- 在您的预加载脚本中创建一个数据库接口,将某些调用传递给您的渲染器,调用时将 return 您需要从数据库中获得的值。例如
渲染器:
let users = window.myCoolApi.get("users");
Preload.js:
let get = function(path){
let data = dbFuncions.readSomeDatafromDB("path");
return data; // Returning the function itself is a no-no shown below
// return dbFuncions.readSomeDatafromDB("path"); Don't do this
}
contextBridge.exposeInMainWorld("myCoolApi", {
get:get
});
还有更多选择,但据我所知,这些通常应该能确保安全。
我是 electron.js 的新手 - 一直在阅读文档和一些类似的 post 此处:
但如何正确实施安全 SQL 集成仍然不是很清楚。基本上,我想创建一个桌面数据库客户端。该应用程序将连接到远程数据库,用户可以 运行 所有类型的预定义查询,结果将显示在应用程序中。
文档说,如果您使用的是远程连接,则不应 运行 渲染器中的节点。然后我是否应该在主进程中请求 SQL 模块并使用 IPC 来回发送数据并预加载 IPCremote?
感谢帮助
简答:是
长答案: 在你的渲染器上允许节点会给你的应用带来很大的安全风险。在这种情况下,最好的做法是创建一个传递给预加载器的函数。您可以使用几个选项来执行此操作:
- 将包裹在另一个函数中的 ipcRenderer.invoke 函数传递给预加载中的渲染器。然后你可以调用你的主进程,它可以通过相同的函数发送回信息,或者通过 window.webContents.send 命令发送它并在你的 window api 上监听它渲染器。例如:
Preload.js:
const invoke = (channel, args, cb = () => {return}) => {
ipcRenderer.invoke(channel, args).then((res) => {
cb(res);
});
};
const handle = (channel, cb) => {
ipcRenderer.on(channel, function (Event, message) {
cb(Event, message);
});
};
contextBridge.exposeInMainWorld("GlobalApi", {
invoke: invoke,
handle:handle
});
渲染器:
let users
window.GlobalApi.handle("users", (data)=>{users=data})
window.GlobalApi.invoke("get", "users")
或:
let users;
window.GlobalApi.invoke("get", "users", (data)=>{users=data})
主要:
ipcMain.handle("get", async (path) => {
let data = dbFunctions.get(path)
window.webContents.send(
path,
data
);
}
- 在您的预加载脚本中创建一个数据库接口,将某些调用传递给您的渲染器,调用时将 return 您需要从数据库中获得的值。例如
渲染器:
let users = window.myCoolApi.get("users");
Preload.js:
let get = function(path){
let data = dbFuncions.readSomeDatafromDB("path");
return data; // Returning the function itself is a no-no shown below
// return dbFuncions.readSomeDatafromDB("path"); Don't do this
}
contextBridge.exposeInMainWorld("myCoolApi", {
get:get
});
还有更多选择,但据我所知,这些通常应该能确保安全。