TGViewer
Библиотека собеса по PHP | вопросы с собеседований Библиотека собеса по PHP | вопросы с собеседований @php_interview_lib · 3.1K subscribers
Post #1259 3.04K
✔️ PHP-тест: Утечка сессии между пользователями

Баг не воспроизводится локально. На проде один юзер видит чужие данные 👇

📦 Задание

Стартап запустил SaaS. Первые две недели тишина. А потом в поддержку прилетело: «Я зашёл в кабинет и увидел чужой аккаунт». В коде сессий и авторизации не трогали давно, там всё стабильно.

// src/Auth/UserSession.php
class UserSession
{
private static ?User $currentUser = null;

public static function set(User $user): void
{
self::$currentUser = $user;
}

public static function get(): ?User
{
return self::$currentUser;
}

public static function clear(): void
{
self::$currentUser = null;
}
}

// src/Middleware/AuthMiddleware.php
class AuthMiddleware
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly JWTService $jwt,
) {}

public function handle(Request $request, callable $next): Response
{
$token = $request->headers->get('Authorization');

if (!$token) {
return new Response(status: 401);
}

$payload = $this->jwt->decode(str_replace('Bearer ', '', $token));
$user = $this->userRepository->find($payload['sub']);

UserSession::set($user);

return $next($request);
}
}

// src/Controller/DashboardController.php
class DashboardController
{
public function index(): Response
{
$user = UserSession::get();

return new Response(
body: $this->renderDashboard($user),
);
}
}

// src/Console/CacheWarmupCommand.php
class CacheWarmupCommand
{
public function execute(): void
{
$users = $this->userRepository->findAll();

foreach ($users as $user) {
UserSession::set($user);
$this->warmupForUser($user);
}

// прогрев завершён
}
}


🔹 Задачи

— Объяснить механизм утечки
— Объяснить, как CacheWarmupCommand триггерит баг и при каком race window
— Переписать UserSession так, чтобы устранить проблему архитектурно, а не патчем

Ставьте → 🔥 если нравится формат. Если нет → 🌚

💬 Решения пишите в комменты под спойлер — сравним подходы.
  • 🔥 14
  • 🤔 5
  • 🌚 2
  • 👍 1
  • 🥱 1
More from @php_interview_lib
  1. Sep 15, 2026❓ Расскажите о паттерне Bridge Bridge — это структурный паттерн, который разделяет абстрак…
  2. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  3. Aug 4, 2026Какова разница между «cookie» и «session»? В PHP «cookie» и «session» — это механизмы упра…
  4. Aug 4, 2026👅 Самое сложное — выбрать не курс, а направление Сегодня хочется разобраться в AI-агентах…
  5. Aug 4, 2026Один доступ вместо вечного выбора между «нужно для работы» и «давно хотелось изучить» 👇
  6. Jul 31, 2026❓ Объясни разницу между Gate и Policy в Laravel? Оба инструмента для авторизации, но с раз…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →