Fresh — серверный фреймворк для Deno, построенный вокруг концепций
islands architecture, строгой типизации и минимального
JavaScript на клиенте. За счёт отсутствия бандлинга, прямого
использования ES-модулей и рендеринга на сервере Fresh по умолчанию
снижает часть типичных рисков, однако не устраняет их полностью. Модель
угроз для Fresh-приложений напрямую соотносится с OWASP Top
10, и каждая категория уязвимостей проявляется с учётом
особенностей Deno и самого фреймворка.
A01: Broken Access Control
В Fresh маршруты реализуются через файловую систему
(routes/), а серверный код выполняется напрямую в
обработчиках Handlers. Отсутствие централизованного
механизма авторизации увеличивает риск ошибок контроля доступа.
Типичные проблемы:
- отсутствие проверки прав пользователя в обработчиках
GET, POST, DELETE;
- полагание только на клиентскую логику islands;
- прямой доступ к маршрутам API без middleware.
Пример потенциально уязвимого обработчика:
export const handler: Handlers = {
async GET(req, ctx) {
const userId = ctx.params.id;
return new Response(await getUserData(userId));
}
};
Отсутствует проверка:
- аутентификации;
- соответствия
userId текущему пользователю;
- роли или уровня доступа.
Корректный подход предполагает:
- серверную проверку сессии или токена;
- централизованный middleware в
routes/_middleware.ts;
- строгую проверку прав на уровне обработчиков.
A02: Cryptographic Failures
Fresh не навязывает криптографические библиотеки. В Deno доступны
стандартные Web Crypto API, но ошибки часто связаны с неправильным
использованием.
Распространённые нарушения:
- хранение паролей в открытом виде;
- использование устаревших алгоритмов (MD5, SHA-1);
- отсутствие HTTPS при работе с cookies;
- самописное шифрование.
Пример неверного хранения пароля:
await db.insert({ email, password });
Безопасная практика:
- хэширование через
bcrypt или argon2;
- использование
crypto.subtle;
- установка флагов
HttpOnly, Secure,
SameSite для cookies;
- обязательное TLS-шифрование.
A03: Injection
Хотя Fresh не использует SQL напрямую, инъекции возможны:
- в базах данных;
- в shell-командах;
- в шаблонах JSX при неконтролируемом вводе.
Опасный пример:
const query = `SELECT * FROM users WHERE email = '${email}'`;
Даже при серверном рендеринге инъекции остаются критичными. JSX не
экранирует данные, переданные в
dangerouslySetInnerHTML.
Защитные меры:
- параметризованные запросы;
- строгая валидация входных данных;
- отказ от интерполяции пользовательского ввода;
- минимизация
dangerouslySetInnerHTML.
A04: Insecure Design
Fresh облегчает быстрый старт, но архитектурные ошибки возникают на
этапе проектирования.
Типичные признаки:
- отсутствие модели угроз;
- смешивание бизнес-логики и HTTP-обработчиков;
- доверие данным из cookies и headers;
- отсутствие ограничений на количество запросов.
Пример небезопасного дизайна:
- авторизация через параметр запроса;
- логика ролей на клиенте;
- отсутствие rate limiting для API.
Безопасный дизайн включает:
- чёткое разделение слоёв;
- серверную проверку всех критичных условий;
- лимиты запросов и таймауты;
- отказ от «скрытых» маршрутов как средства защиты.
A05: Security
Misconfiguration
Deno и Fresh имеют строгую модель разрешений, но при деплое часто
отключаются ограничения.
Распространённые ошибки:
- запуск Deno с
--allow-all;
- публикация debug-логов;
- отсутствие CORS-политик;
- открытые stack traces в ответах сервера.
Пример небезопасного запуска:
deno run --allow-all main.ts
Рекомендации:
- минимальные разрешения (
--allow-net,
--allow-env);
- настройка CORS в middleware;
- отключение подробных ошибок в production;
- явная конфигурация окружения.
A06: Vulnerable and
Outdated Components
Fresh активно использует внешние ES-модули по URL. Это создаёт
уникальный риск.
Проблемы:
- отсутствие lock-файлов;
- автоматическое обновление зависимостей;
- импорт из непроверенных источников.
Пример:
import { something } FROM "https://example.com/lib.ts";
Защита:
- использование
deno.lock;
- фиксация версий;
- аудит зависимостей;
- предпочтение официальных репозиториев.
A07:
Identification and Authentication Failures
Fresh не предоставляет встроенной системы аутентификации.
Ошибки:
- хранение сессий в localStorage;
- отсутствие ротации токенов;
- слабые JWT-секреты;
- отсутствие срока действия сессии.
Опасный подход:
localStorage.setItem("token", jwt);
Безопасная реализация:
- HttpOnly cookies;
- короткоживущие access-токены;
- refresh-токены с серверной проверкой;
- серверное хранилище сессий.
A08: Software and Data
Integrity Failures
Риск возникает при:
- динамической загрузке кода;
- CI/CD без проверок;
- отсутствии подписей артефактов.
Особенность Fresh:
- прямой запуск кода без сборки;
- зависимость от внешних URL-модулей.
Меры защиты:
- контроль хэшей зависимостей;
- ограничение прав CI;
- отказ от динамического
eval;
- проверка источников обновлений.
A09: Security
Logging and Monitoring Failures
Fresh-приложения часто не имеют централизованного логирования.
Недостатки:
- отсутствие логов авторизации;
- игнорирование неудачных попыток входа;
- отсутствие алертов.
Пример отсутствия логирования:
if (!authorized) return new Response("Forbidden", { status: 403 });
Не фиксируется:
- IP;
- user-agent;
- время;
- контекст запроса.
Правильный подход:
- структурированные логи;
- хранение событий безопасности;
- интеграция с SIEM;
- минимизация чувствительных данных в логах.
A10: Server-Side Request
Forgery (SSRF)
В Fresh SSRF возможен через:
- прокси-эндпоинты;
- загрузку внешних ресурсов;
- серверные fetch-запросы с пользовательским вводом.
Уязвимый пример:
await fetch(urlFromUser);
Опасности:
- доступ к внутренним сервисам;
- утечка метаданных облака;
- обход сетевых ограничений.
Методы защиты:
- whitelist доменов;
- запрет приватных IP-диапазонов;
- таймауты и лимиты;
- строгая валидация URL.
Итоговая специфика
Fresh в контексте OWASP
Fresh снижает поверхность атак за счёт:
- server-first архитектуры;
- отсутствия лишнего JavaScript;
- строгой модели разрешений Deno.
Одновременно он требует:
- осознанного проектирования безопасности;
- ручной реализации аутентификации и авторизации;
- строгого контроля зависимостей и конфигураций.
OWASP Top 10 полностью применим к Fresh-приложениям, но каждая
категория уязвимостей проявляется через призму server-side rendering,
islands architecture и экосистемы Deno.