Безопасность Electron
Electron объединяетNode.js и среды браузера, что делает десктопные приложения очень мощными, но также создаёт определённые риски безопасности.
Правильные политики безопасности могут снизить риски XSS, удалённого выполнения кода (RCE) и утечки данных.
Контрольный список безопасности и распространённые уязвимости
Контрольный список безопасности
- Включитеизоляцию контекста(
contextIsolation) - ИспользованиеСкрипт предзагрузки(
preload.js) Предоставление безопасных API - Не используйте модули Node.js напрямую в процессе рендеринга.
- Включитережим песочницы(
sandbox: true) - НастройкаПолитика безопасности контента (CSP)
- Используйте IPC безопасно, проверяйте источники и входные данные.
- Ограничьте доступ приложения к системным разрешениям, следуя принципу наименьших привилегий.
- Избегайте загрузки недоверенного удалённого содержимого
Распространённые риски безопасности
- Инъекция удалённого содержимого: Загрузка неизвестных URL-адресов или HTML-файлов может привести к выполнению вредоносного JS.
- Небезопасные вызовы IPC: Процесс рендеринга может вызывать любой метод главного процесса.
- Произвольное выполнение Node.js: включение в процессе рендеринга
nodeIntegrationМожет быть использовано для выполнения системных команд - XSS-атака: пользовательский ввод напрямую отображается на странице
- Уязвимости зависимостей: использование устаревших сторонних библиотек
Изоляция контекста
Подробнее о contextIsolation
Изоляция контекста позволяет процессу рендеринга и главному процессу выполняться в разных средах JS.
JS веб-страницы в процессе рендеринга не может напрямую обращаться к API Node.js; вместо этого интерфейсы предоставляются через безопасные preload-скрипты.
const mainWindow = new BrowserWindow({
webPreferences: {
contextIsolation: true, // 启用上下文隔离
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: false // 禁止在渲染进程使用 Node.js
}
})
Зачем нужна изоляция контекста
- Предотвратить прямой доступ загруженных веб-страниц или сторонних скриптов к Node.js.
- Предотвратить получение злоумышленниками системных привилегий через XSS.
- Пусть процесс рендеринга занимается только UI, а главный процесс — системными операциями.
Переход к изолированному контексту
- Использование
contextBridge.exposeInMainWorldПредоставление безопасных API - Поместите все системные операции в главный процесс и вызывайте их через IPC.
Пример:
// preload.js
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('api', {
getData: () => ipcRenderer.invoke('get-data')
})
Процесс рендеринга только вызываетwindow.api.getData(), не может напрямую управлять ОС.
Режим песочницы
Включите песочницу
Режим песочницы заставляет процесс рендеринга работать как обычная веб-страница в браузере, полностью изолированно от среды Node.js.
const mainWindow = new BrowserWindow({
webPreferences: {
sandbox: true,
contextIsolation: true,
preload: path.join(__dirname, 'preload.js')
}
})
Ограничения песочницы и меры противодействия
- Ограничение: процесс рендеринга не может напрямую обращаться к модулям Node.js.
- Мера противодействия: вызывайте безопасные методы, предоставляемые главным процессом, через IPC.
- Преимущество: повышает безопасность и предотвращает повреждение системы вредоносными скриптами.
Content Security Policy (CSP)
CSP может предотвращать XSS-атаки и атаки с внедрением данных, ограничивая источники ресурсов, которые могут загружать веб-страницы.
Пример конфигурации CSP
<meta http-equiv="Content-Security-Policy" content=" default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self' https://api.example.com;">
Описание:
default-src 'self': По умолчанию разрешать только ресурсы того же источникаscript-src 'self': Разрешать только локальные скриптыstyle-src 'self' 'unsafe-inline': Разрешить встроенные стилиconnect-src: Ограничить домены запросов AJAX / WebSocket
Предотвращение XSS-атак
- Никогда не используйте напрямую в процессе рендеринга
innerHTMLОтображение пользовательского ввода - Экранируйте пользовательский ввод или используйте шаблонизацию фреймворка.
Безопасная IPC-коммуникация
Проверка источника сообщения
Главный процесс должен различать источник процесса рендеринга, чтобы избежать произвольного выполнения.
Пример:
ipcMain.handle('do-action', (event, data) => {
if (event.senderFrame.url.startsWith('file://')) {
// 安全来源,执行操作
} else {
console.warn('不安全的 IPC 请求被阻止')
}
})
Проверка входных данных
- Все данные, передаваемые через IPC, должны проходить проверку типа и области действия.
- Избегайте внедрения вредоносных команд или путей к файлам
function validateInput(data) {
if (typeof data !== 'string' || data.length > 100) throw new Error('非法输入')
return data
}
Принцип наименьших привилегий
- Предоставляйте процессу рендеринга только необходимую функциональность
- Не предоставляйте все API Node.js или системные привилегии.
- Используйте скрипты предзагрузки для управления областью доступа к интерфейсу.
Итог
Суть лучших практик безопасности Electron:Изоляция + Проверка + Наименьшие привилегии:
- Изоляция: включите изоляцию контекста, режим песочницы
- Проверка: CSP, защита от XSS, проверка входных данных IPC
- Ограничьте разрешения: минимизируйте привилегии процесса рендеринга и предоставляйте только необходимые API.
Следование этим принципам может значительно снизить риск атаки на настольные приложения или утечки данных.
Другие расширения