Tengo una aplicación electrónica y estoy usando contextBridge.exposeInMainWorld para exponer algunos métodos de .on como .on, .removeListener e .invoke , estos métodos están "protegidos" al tener una declaración if que verifica si el "canal" pasado es válido .
Usando el siguiente código:
const validateIPC = (channel) => { if (!channel || !channel.startsWith("myapp:")) return false; return true; }; contextBridge.exposeInMainWorld("electron", { ipcRenderer: { on(channel, listener) { if (validateIPC(channel)) { ipcRenderer.on(channel, (evt, message) => { listener(evt, message); }); } }, removeListener(channel, listener) { if (validateIPC(channel)) { ipcRenderer.removeListener(channel, (evt, message) => { listener(evt, message); }); } }, invoke(channel, data) { if (validateIPC(channel)) { return ipcRenderer.invoke(channel, data); } }, }, }; ¿Es seguro verificar solo si el canal comienza con alguna cadena aleatoria? Vi esto en el código fuente de vscode disponible en github, sin embargo, también leí algunas soluciones usando una matriz de cadenas para validar los canales. Si es seguro, ¿por qué no puedo simplemente exponerlo sin verificar si el canal comienza con algún nombre aleatorio? ¿Hay algún canal predeterminado que no se pueda exponer?
Sí, es absolutamente seguro verificar si el nombre de su canal solo comienza con una cadena "cierta". Si se trata de una cadena "aleatoria", entonces se puede argumentar que hay pocas razones para preocuparse por implementar un sistema de "nomenclatura de canales".
Tiene razón en que puede exponer los métodos de ipcRenderer sin usar los nombres de los canales. Eso en sí mismo no es un problema de seguridad.
P.EJ:
// Import the necessary Electron components. const contextBridge = require('electron').contextBridge; const ipcRenderer = require('electron').ipcRenderer; // Exposed protected methods in the render process. contextBridge.exposeInMainWorld("electron", { ipcRenderer: { on(channel, listener) { ipcRenderer.on(channel, (evt, message) => { listener(evt, message); }); }, removeListener(channel, listener) { ipcRenderer.removeListener(channel, (evt, message) => { listener(evt, message); }); }, invoke(channel, data) { return ipcRenderer.invoke(channel, data); } } }; Lo que es un problema de seguridad es si configura nodeIntegration: true y contextIsolation: false durante la creación de su ventana. Eso permitiría que cualquier persona que pueda ejecutar Javascript en su representación (por ejemplo, si DevTools aún está accesible) acceder al hilo principal y posiblemente llamar a todo tipo de funciones definidas por el usuario y Node.js. EG: Acceso a bases de datos en línea o API utilizando cualquier clave de API codificada de subproceso principal.
Otra preocupación de seguridad sería si agrega API de electrones particulares a su secuencia de comandos preload.js que simplemente no debería ser accesible desde los subprocesos de procesamiento.
En cuanto a los "canales predeterminados que no se pueden exponer", los canales en sí no son un problema, son las funciones subyacentes (expuestas) las que pueden plantear un problema de seguridad si se puede acceder a ellas desde los subprocesos de procesamiento.
La implementación de un sistema de "nomenclatura de canales" dentro de su archivo preload.js solo permite una forma más fácil de rastrear y administrar eventos de IPC, tal como se hace con los eventos de Node.js. No es para todos y de ninguna manera es obligatorio / requerido tener un script preload.js que use el sistema de "nombre de canal". Es una preferencia puramente personal.