Fresh — серверный фреймворк для Deno, ориентированный на рендеринг на сервере и минимизацию клиентского JavaScript. Это архитектурное решение напрямую влияет на модель угроз.
Ключевые особенности, формирующие поверхность атаки:
node_modules.Каждый из этих пунктов снижает классические риски, но добавляет свои векторы, которые необходимо учитывать при аудите.
Маршруты во Fresh реализуются через файловую систему
(routes/). Любой файл в этой директории автоматически
становится HTTP-эндпоинтом.
Основные риски:
Пример потенциально уязвимого обработчика:
export const handler = {
async POST(req) {
const data = await req.json();
await saveToDb(data);
return new Response("ok");
},
};
Проблемы:
dataПри аудите необходимо:
routes/ на предмет
публичностиFresh использует Preact и JSX, что по умолчанию экранирует HTML. Однако XSS возможен в следующих случаях:
dangerouslySetInnerHTML<div dangerouslySetInnerHTML={{ __html: content }} />
Любой HTML, поступающий извне, должен:
return new Response(`<h1>${title}</h1>`, {
headers: { "content-type": "text/html" },
});
Если title формируется из пользовательского ввода — это
прямой XSS.
Во время аудита:
dangerouslySetInnerHTMLFresh не навязывает собственный механизм защиты от CSRF. Любые POST, PUT, DELETE-запросы, изменяющие состояние, требуют явной защиты.
Типовой риск:
Origin / RefererРекомендуемые меры:
SameSite=Strict или
LaxВо Fresh нет встроенной системы аутентификации, что перекладывает ответственность на разработчика.
Частые ошибки:
Во время аудита необходимо:
Islands — единственные места, где выполняется клиентский JavaScript. Это снижает риск XSS, но не устраняет его полностью.
Потенциальные проблемы:
propseval, Function, динамических
импортовАудит включает:
Fresh использует URL-импорты:
import { something } from "https://esm.sh/package@1.2.3";
Риски supply chain:
Во время аудита:
Deno предоставляет строгую модель безопасности через permissions:
--allow-net--allow-env--allow-read--allow-writeТиповая ошибка — запуск приложения с избыточными разрешениями.
Аудит включает:
Fresh не добавляет security headers автоматически.
Критически важные заголовки:
Content-Security-PolicyX-Frame-OptionsX-Content-Type-OptionsReferrer-PolicyStrict-Transport-SecurityПример усиления безопасности:
headers.set("Content-Security-Policy", "default-src 'self'");
headers.set("X-Content-Type-Options", "nosniff");
При аудите проверяется:
unsafe-inline и unsafe-eval без
необходимостиОшибки во Fresh часто обрабатываются напрямую через
Response.
Риск:
Аудит включает:
Fresh по умолчанию предлагает более безопасную базу, чем классические SPA-фреймворки, за счёт:
Однако безопасность приложения полностью определяется качеством серверной логики. Аудит должен концентрироваться на маршрутах, обработке данных, разрешениях Deno и осознанном использовании islands, а не на клиентской части.