Чутливі дані часто витікають не через злам бази, а через допоміжні системи: логи, звіти про помилки, інструменти налагодження, сторонні сервіси моніторингу.
Де вони з'являються:
- стек винятку містить аргументи функцій - пароль, переданий у
login($email, $password), опиниться у звіті про помилку; - контекст запиту в Sentry/Flare/Bugsnag - тіло запиту, заголовки (
Authorization,Cookie); - власні логи -
Log::info('Login attempt', $request->all()); - Telescope і Debugbar - записують запити, SQL з параметрами, сесії;
- серіалізовані моделі в логах і черзі - усі атрибути, крім
$hidden.
Інструменти Laravel і PHP:
1. #[\SensitiveParameter] (PHP 8.2+) - значення параметра не потрапить у стек винятку:
public function attempt(string $email, #[\SensitiveParameter] string $password): bool
Laravel позначає так паролі у своїх методах автентифікації.
2. $hidden у моделях - атрибути, що не серіалізуються в масив і JSON (password, remember_token, two_factor_secret).
3. dontFlash у налаштуванні винятків - поля, які не повертаються в сесію після помилки валідації (за замовчуванням password, password_confirmation, current_password):
$exceptions->dontFlash(['card_number', 'cvv']);
4. Налаштування сервісів моніторингу - фільтри полів і заголовків перед відправкою (у Sentry - before_send, списки чутливих ключів).
5. Telescope на продакшені - вимкнений або з фільтрами (Telescope::hideRequestParameters([...]), hideRequestHeaders([...])) і доступом лише для адміністраторів.
Правила для власного логування:
- логувати ідентифікатори, а не дані:
user_id,order_id, а не email, адресу, номер картки; - ніколи
$request->all()у лог; - структуровані логи з явним переліком полів - простіше перевірити, що туди потрапляє;
- термін зберігання логів - персональні дані в них теж підпадають під вимоги захисту даних.
Якщо секрет усе ж потрапив у лог чи систему моніторингу - вважати його скомпрометованим: змінити пароль, відкликати токен, ротувати ключ. Видалення запису з логу не скасовує того, що його могли прочитати.
Перевірка: раз на якийсь час переглядати реальні записи логів і звітів про помилки очима - саме так знаходять «а тут, виявляється, повний JSON запиту з паролем».