diff --git a/README.md b/README.md index bc64e42..b1c2eb1 100644 --- a/README.md +++ b/README.md @@ -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). --- diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..505ab64 --- /dev/null +++ b/SECURITY.md @@ -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 формируется программно из числовых матриц и не содержит тегов `