add: Политика безопасности и конфиденциальности (SECURITY)
This commit is contained in:
@@ -43,8 +43,8 @@
|
||||
|
||||
- **Frontend сборка:** [frontend-assembly/README.md](frontend-assembly/README.md) — сборка Alpine.js, Tailwind CSS, HTMX.
|
||||
- **ИИ-интеграция:** [public/llms.txt](public/llms.txt) — контекст для LLM и агентных систем.
|
||||
- **Безопасность и приватность:** [SECURITY.md](SECURITY.md) — Zero-PII, правила отслеживания и защита от накруток.
|
||||
- **Планы и архитектура:** [_blueprint/plan-draft.md](_blueprint/plan-draft.md).
|
||||
- **Django Management Commands:** [_blueprint/management-commands.md](_blueprint/management-commands.md) — пакетные фоновые задачи.
|
||||
- **Предыстория:** CLI-утилита [2026-image-hatftone-effect](https://git.cube2.ru/erjemin/2026-image-hatftone-effect).
|
||||
|
||||
---
|
||||
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
# Политика безопасности и конфиденциальности (SECURITY)
|
||||
|
||||
Данный документ описывает принципы защиты данных, архитектуру приватности по умолчанию (Privacy by Default), механизмы предотвращения накруток и порядок сообщения об уязвимостях в проекте **Hypn0 (HypnoSVG)**.
|
||||
|
||||
---
|
||||
|
||||
## 1. Архитектура приватности: Zero-PII
|
||||
|
||||
Платформа Hypn0 спроектирована по принципу **нулевого сбора персональных данных (Zero Personally Identifiable Information)**:
|
||||
- Мы не требуем регистрации, ввода логинов, паролей, адресов электронной почты или номеров телефонов.
|
||||
- В базе данных проекта отсутствуют таблицы пользователей или учетных записей.
|
||||
- Сгенерированные SVG-файлы содержат только математические координаты геометрических примитивов и инлайновые CSS-анимации. В них не встраиваются метаданные исходных изображений (EXIF-теги, геолокация и сведения об устройствах вырезаются при растеризации).
|
||||
|
||||
---
|
||||
|
||||
## 2. Режим без согласия (Default / No-Tracking)
|
||||
|
||||
Если посетитель не выразил явного согласия на отслеживание (не нажал кнопку подтверждения в модальном окне):
|
||||
|
||||
1. **Никаких клиентских идентификаторов:** В браузере пользователя не создаются cookie-файлы и записи `localStorage`.
|
||||
2. **Отключение внешних систем аналитики:** Внешние трекеры и счетчики метрик (Яндекс.Метрика, Google Tag Manager и др.) блокируются на уровне шаблонизатора (`{% if ALLOW_TRACKING %}`) и физически не загружаются на клиентское устройство.
|
||||
3. **Серверные логи:** Единственная информация, которая фиксируется инфраструктурой — стандартные системные журналы веб-сервера (Nginx / Gunicorn), включающие IP-адрес, User-Agent и запрашиваемый URL. Логи используются исключительно для защиты от DDoS-атак, мониторинга доступности и хранятся ограниченное время с регулярной ротацией.
|
||||
|
||||
---
|
||||
|
||||
## 3. Ограничения для пользователей без согласия
|
||||
|
||||
Пользователи, отказавшиеся от отслеживания или не давшие явного согласия, могут свободно использовать локальный генератор и просматривать галерею. Однако им **недоступны социальные функции платформы**:
|
||||
- Голосование за работы (лайки / дизлайки);
|
||||
- Отправка жалоб (клеймы на спам или неприемлемый контент);
|
||||
- Публикация собственных работ в общую Галерею Сообщества.
|
||||
|
||||
### Причина ограничений: защита от накруток и бот-атак
|
||||
Для работы гравитационного алгоритма рейтинга и справедливого распределения работ по уровням («Инкубатор», «Выбор Мозгового Слизня», «Золотой фонд») платформе необходим уникальный анонимный якорь клиента.
|
||||
|
||||
Если клиент не дал согласие на запись анонимного идентификатора устройства, сервер не имеет возможности отличить повторный клик от первичного. Допуск анонимных неидентифицированных запросов к голосованию привел бы к мгновенной накрутке рейтинга скриптами, спаму и искажению всей экосистемы галереи.
|
||||
|
||||
---
|
||||
|
||||
## 4. Механизм согласия и идентификации (`hypn0_vid`)
|
||||
|
||||
При нажатии кнопки «Подчиниться Гипножабе!» (получение согласия):
|
||||
|
||||
1. В браузере генерируется случайный криптографический идентификатор версии 4: `crypto.randomUUID()`.
|
||||
2. Значение сохраняется в cookie и `localStorage` под ключом `hypn0_vid`.
|
||||
3. Срок жизни cookie составляет 2 года, флаги передачи настроены на безопасный режим (`path=/; SameSite=Lax`).
|
||||
4. Значение `hypn0_vid` является псевдослучайной последовательностью символов и не может быть сопоставлено с реальной личностью пользователя.
|
||||
5. Идентификатор используется бэкендом исключительно в модели `TbVote` для ограничения частоты действий (Rate Limiting) и гарантии принципа «один голос на одну картину от одного браузера».
|
||||
|
||||
---
|
||||
|
||||
## 5. Безопасность обработки файлов и генерации SVG
|
||||
|
||||
- **Санитизация входных данных:** Все загружаемые изображения проходят валидацию через библиотеку Pillow. Бинарный код файлов декодируется в память, отсекая потенциально вредоносные вложения и эксплойты форматов.
|
||||
- **Безопасность SVG:** Выходной SVG формируется программно из числовых матриц и не содержит тегов `<script>`, внешних ссылок `xlink:href` или обработчиков событий `onload`/`onclick`. Это исключает угрозу Stored XSS при просмотре чужих работ.
|
||||
- **Ограничения ресурсов (DoS Prevention):** Заданы строгие ограничения на максимальный размер входного файла, разрешение сетки (`cols`) и радиус элементов, предотвращающие исчерпание памяти сервера (Memory Exhaustion).
|
||||
|
||||
---
|
||||
|
||||
## 6. Сообщение об уязвимостях (Vulnerability Disclosure)
|
||||
|
||||
Если вы обнаружили уязвимость безопасности в сервисе Hypn0, просим вас ответственно подойти к раскрытию информации:
|
||||
|
||||
- **Канал связи:** Направьте подробное описание проблемы мейнтейнеру проекта через issue-трекер репозитория с пометкой безопасности или по электронной почте администратора.
|
||||
- **Что указать:** Описание вектора атаки, шаги для воспроизведения (PoC) и потенциальное влияние на систему.
|
||||
- **Сроки:** Мы стремимся подтвердить получение отчета в течение 48 часов и оперативно выпустить патч. Просим воздержаться от публичного раскрытия до момента устранения уязвимости.
|
||||
Reference in New Issue
Block a user