* * ... * * * if (!CSRF::validate($request->post('csrf_token'))) { * throw HTTPException::factory(403); * } */ class CSRF { /** @var string Имя поля/ключа сессии для токена */ public static string $key = 'csrf_token'; /** * Возвращает токен текущей сессии, создавая его при первом обращении. * * @return string */ public static function token(): string { $session = Session::instance(); $token = $session->get(self::$key); if (!$token) { $token = bin2hex(random_bytes(32)); $session->set(self::$key, $token); } return $token; } /** * Проверяет присланный токен против токена из сессии. * * @param string|null $value Значение из Request::post(CSRF::$key) * @return bool */ public static function validate(?string $value): bool { $token = Session::instance()->get(self::$key); return is_string($value) && is_string($token) && hash_equals($token, $value); } /** * Возвращает готовое скрытое поле с токеном для вставки в форму. * * @return string */ public static function field(): string { return ''; } }