КАР-точки — не SaaS. Вы деплоите свой инстанс; секреты и данные принадлежат вам.
| Актив | Где лежит | Кто видит |
|---|---|---|
| Карточки / папки / журнал | Supabase (ваш проект) + локальное зеркало IDB | Только user_id владельца (RLS) |
| Сессия | localStorage (kar_session) |
Браузер пользователя |
| Личные API-ключи (Supadata / Gemini / Groq / stock) | settings (облако или local) |
Владелец аккаунта; уходят на ваш /api/* только в момент импорта/TTS |
| Серверные ключи | Cloudflare Pages secrets / env | Только Functions на вашем деплое |
- RLS на таблицах Supabase и Storage policies
- Санитайзер rich-text (
sanitizeRich) - Security headers в
public/_headers(CSP,X-Content-Type-Options,Referrer-Policy,Permissions-Policy, COOP) — копируются вdist/приbuild:bundle - Rate-limit на Cloudflare Functions (
functions/api/_middleware.js+ KV) для дорогих/api/*
- Свой проект Supabase + миграции (
npm run db:push). - Секреты Pages:
GEMINI_API_KEY/GROQ_API_KEY/SUPADATA_API_KEY(и stock keys по желанию). - Не публикуйте
js/config.jsс чужими ключами в открытый форк. - Для публичного демо: либо личные BYOK-ключи у каждого пользователя, либо жёсткие Cloudflare rate limits / WAF — иначе чужой трафик сожжёт квоту LLM.
- Нет глобального auth-gate на
/api/*(Functions доступны любому, кто знает URL инстанса). - Ключи в
settingsне шифруются at-rest сверх того, что даёт Supabase. - XSS через пользовательский контент смягчается санитайзером, но CSP + аккуратность с
innerHTMLостаются обязательными.
- Отозвать ключ у провайдера (Google AI Studio / Groq / Supadata).
- Обновить Pages secret или ключ в Настройки → интеграции.
- При утечке сессии — «Выйти» на всех устройствах и сменить пароль Supabase Auth.
См. корневой SECURITY.md.