# Безопасность и сессии

Elang предоставляет базовые средства безопасности и настройки ответов по умолчанию. Вашему приложению всё равно нужна полноценная схема аутентификации, авторизации и развёртывания.

## Пароли

```php
use Elang\Security\Password;

$hash = $passwords->hash($plainTextPassword);
$isValid = $passwords->verify($submittedPassword, $storedHash);
```

Сервис использует API паролей PHP с Argon2id. После успешной проверки используйте `needsRehash()`, чтобы определить, нужно ли обновить сохранённый хеш. Убедитесь, что сборка PHP поддерживает Argon2id.

## Шифрование

```php
use Elang\Security\Encryption;

$ciphertext = $encryption->encrypt('private value');
$plaintext = $encryption->decrypt($ciphertext);
```

Sodium secretbox проверяет подлинность зашифрованных данных и использует новый nonce. Отсутствующий или недопустимый APP_KEY не позволяет создать сервис шифрования. Храните ключ в безопасности; в этой предварительной версии ротация ключа выполняется вручную.

## Сессии и CSRF

Зарегистрируйте SessionMiddleware, а затем CsrfMiddleware. Внедрите `Elang\Security\Csrf` и вызывайте `$csrf->token($request)` при отображении формы. Добавьте токен в скрытое поле `_token` или в заголовок `X-CSRF-Token`.

Cookie сессии используют HttpOnly и SameSite=Lax, а при HTTPS-запросе также Secure. После аутентификации обновляйте идентификатор сессии с помощью `$request->getSession()->migrate(true)`.

## Защита ответов

Ядро задаёт строгую Content Security Policy, запрет отображения во фреймах, защиту от определения MIME-типа по содержимому и политику передачи источника перехода. Ошибки JSON и HTML содержат идентификаторы запросов. Ответы с ошибками в рабочей среде скрывают внутренние сообщения исключений.

## Сообщение о проблеме

Не публикуйте учётные данные или подробности эксплуатации уязвимости в публичной задаче. Текущие правила сообщения о проблемах приведены в SECURITY.md репозитория. Эта предварительная версия не проходила независимый аудит безопасности.
