# Безопасность Celena CMS

Сквозные принципы безопасности, реализованные в ядре. Соблюдай их и в плагинах/темах.

---

## CSRF

- Токен хранится в сессии, обновляется при логине/логауте.
- Все non-GET запросы должны содержать токен:
  - в форме: `{csrf}` → `<input type="hidden" name="_csrf" value="...">`,
  - или в заголовке `X-CSRF-Token`.
- Валидация: `Celena\Core\Security\Csrf::validate($token)`.
- В шаблоне для AJAX добавляйте `{csrf format="meta"}` в `<head>` — `celena.js` подхватит токен автоматически.

## XSS

- Шаблонизатор автоматически экранирует `{var}`. Чтобы вывести как HTML — `{var|raw}` (только для доверенного содержимого).
- В PHP — `e($value)` перед эхо.
- Для пользовательского HTML (комментарии, новости) использовать whitelist-санитизацию (TODO: `Celena\Core\Security\HtmlPurifier`).

## SQL Injection

- Запрещена конкатенация SQL.
- Только `Celena\Core\Database\QueryBuilder` или `Connection::run($sql, $params)` с параметрами.
- Идентификаторы (имена таблиц/колонок) экранируются драйвером через `quoteId()`.

## Auth

- Пароли — `password_hash()` с ARGON2ID (`Celena\Core\Security\Password`).
- Защита от перебора: `Celena\Core\Security\RateLimiter` (5 попыток / 5 мин по IP+email).
- При логине — `session_regenerate_id(true)`.
- Remember-me: selector + validator (validator хранится только хешем).
- 2FA TOTP — опционально (поле `totp_secret` в `celena_users`).

## Сессии

- Cookie: `HttpOnly`, `SameSite=Lax`, `Secure` при HTTPS.
- Регенерация ID при логине и смене привилегий.

## Загрузки файлов

- Whitelist mime + extension + magic bytes.
- Имена файлов ренеймятся в `{uuid}.{ext}`.
- EXIF чистится, изображения re-encode'ятся.
- Превью генерируются в WebP.

## HTTP-заголовки

`.htaccess` и `nginx.conf.example` уже выставляют:
- `X-Content-Type-Options: nosniff`
- `X-Frame-Options: SAMEORIGIN`
- `Referrer-Policy: strict-origin-when-cross-origin`

CSP с nonce — добавляется на этапе релиза 1.0.

## Плагины

- Подпись Ed25519 проверяется перед распаковкой zip.
- Поле `permissions` в манифесте декларирует доступ — на это будут ограничения в API.
- Плагин не может писать в `/core` (защита на уровне Installer).

## Логи аудита

`storage/logs/audit.log` (`Celena\Core\Logger`):
- попытки логина (успех/провал, IP),
- изменения настроек и установки плагинов,
- ошибки безопасности (CSRF, превышение лимита).

## Ответственное раскрытие

Нашли уязвимость? Напишите на `security@celena.io` (PGP-ключ в репозитории), не публикуйте до фикса.
