mirror of
https://github.com/avecms/AVE.cms.git
synced 2026-08-01 00:45:44 +00:00
3.3 KiB
3.3 KiB
Сессии и CSRF
App\Common\Session — работа с сессией и токеном CSRF. Сессия хранится в БД
(DB-backed handler), поднимается в App::init() через Session::init(). Сайт и
панель используют одну сессию и один cookie.
use App\Common\Session;
Данные сессии
| Метод | Назначение |
|---|---|
get($key) |
Прочитать значение. |
set($key, $value) |
Записать значение. |
check(...$keys) |
Есть ли ключ(и). |
del(...$keys) |
Удалить ключ(и). |
Session::set('wizard.step', 2);
$step = (int) Session::get('wizard.step');
if (Session::check('cart')) { ... }
Session::del('wizard.step');
Управление сессией
| Метод | Назначение |
|---|---|
init() / start() |
Инициализация/старт (делает ядро). |
isActive() |
Активна ли сессия. |
regenerateId($deleteOld = false) |
Сменить ID (после логина — против фиксации сессии). |
getId() / setId() / getName() / setName() |
ID/имя сессии. |
setDomain($domain = '') |
Домен cookie (пусто = host-only, важно на поддоменах). |
destroy() |
Уничтожить сессию (при выходе). |
CSRF
Токен
$token = Session::csrfToken(); // стабильный per-session токен
Токен стабилен в пределах сессии (не ротируется на каждый запрос), сравнение —
через hash_equals. Сбросить принудительно: Session::regenerateCsrf().
В HTML-форме
<form method="post" action="/notes">
<input type="hidden" name="_csrf" value="{{ csrf_token }}">
...
</form>
В AJAX-запросе
Передавайте токен заголовком X-CSRF-Token (это делает Adminx.Ajax автоматически
для не-GET запросов):
fetch(url, { method: 'POST', headers: { 'X-CSRF-Token': token }, body: fd });
Проверка на сервере
В контроллере — через обёртку (см. Контроллеры):
public function store(array $params = array())
{
if (($err = $this->csrfGuard()) !== null) { return $err; } // читает X-CSRF-Token или _csrf
// ...
}
Низкоуровнево:
Session::verifyCsrf($token); // бросит исключение при несовпадении
Практика
- Проверяйте CSRF на всех POST/PUT/DELETE — на чтении (GET) не нужно.
- После успешного логина вызывайте
regenerateId(true)(защита от session fixation). - Для поддоменов держите cookie host-only (
setDomain('')) — иначе сессия «утечёт» на другой хост. - Не кладите в сессию большие объёмы данных — она в БД, это лишняя нагрузка.