Безопасность
Исходящая сеть
URL исходящего HTTP (network.request) и WebSocket (network.websocket) проходят проверку:
- DNS-запрос с кэшем 5 минут
- Заблокированы:
localhost,127.0.0.1,::1, частные диапазоны RFC1918 (192.168.*,10.*,172.16–172.31.*) - HTTP: максимум 5 одновременных запросов, таймаут 10 с, редиректы не выполняются
- WebSocket: максимум 5 одновременных соединений, только
ws:///wss://, тот же чёрный список хостов
Нет отдельного API песочницы для привилегированного auth-сервера. Обмен OAuth-токенами — обычный network.request.post на публичный HTTPS URL, который вы настраиваете (см. OAuth и секреты).
Входящий HTTP
Аддоны не открывают порты. Входящие маршруты регистрируются на Express-сервере главного процесса:
- HTTP аддона:
/addon/{id}/{path} - Статический веб:
/addon_static/{id}/ - Путь Socket.IO:
/addon/socket.io, пространство имён/addon/{id}/{path}
Params и конфиг
Записи в api.config.updateParams и api.config.setConfig проверяются в главном процессе (лимиты размера, проверка разрешений).
Выполнение в VM
Начальное выполнение index.js ограничено 5 секундами. Ошибки в таймерах и обработчиках событий перехватываются и логируются; воркер не падает.
Неперехваченные ошибки вне этих обёрток по-прежнему могут уронить процесс воркера. После 3 последовательных падений без стабильной работы автоперезапуск прекращается, пока пользователь не перезапустит аддон в настройках — см. Жизненный цикл — Защита от цикла падений.
Токен доступа фронтенда (data.token)
Каждый экземпляр аддона получает стабильный секрет на устройство, id аддона и путь установки в data.token. Он добавляется к URL виджета/статики как ?token=….
Проверяйте query.token === data.token (или эквивалентный заголовок) на HTTP-эндпоинтах, предназначенных только для встроенной веб-страницы, чтобы другие локальные страницы не могли их вызывать.
Токен меняется, если пользователь переустанавливает аддон или переносит папку.
Разрешение ROOT
require() и неограниченный доступ к модулям доступны только с ROOT. Не запрашивайте ROOT в распространяемых аддонах.
Приватное хранилище
storage.Read() / Write() сохраняют JSON в {installPath}/storage_data.json. Без шифрования; считайте локальным кэшем. Удаляется при деинсталляции.