Авторизація та контроль доступу
Автентифікація доводить, хто ти. Авторизація визначає, що тобі можна чіпати. Найпоширеніша і найшкідливіша помилка в сучасних застосунках - неправильна друга частина: користувач, який увійшов, читає або змінює дані, які йому не належать.
Чек-лист
- Перевіряй власність на кожен доступ до об'єкта. Для кожного маршруту, який приймає id (рахунок, нотатку, проєкт, повідомлення), переконайся, що поточний користувач є власником або має доступ до цього конкретного запису, перш ніж повернути або змінити його. Це Broken Object Level Authorization (BOLA), також відома як IDOR, і вона посідає перше місце у ризиках OWASP.
- Фільтруй за власником, а не лише за id. Запит на кшталт
SELECT * FROM invoices WHERE id = ?є IDOR. Зроби йогоWHERE id = ? AND owner_id = ?і поверни 404, якщо запис не знайдено. - Не покладайся на клієнт, щоб щось приховати. Прихована кнопка або відсутнє посилання - це не контроль доступу. Перевірка має бути на сервері.
- Зберігай авторизацію під час рефакторингу. Перевірки доступу, додані в одній зміні, часто губляться в наступній. Повторно перевіряй власність після кожної зміни маршрутів даних.
- Вмикай безпеку на рівні рядків у базі даних, якщо твоя платформа це підтримує, щоб забута перевірка в коді все одно була перехоплена на рівні даних.
- Захищай кожен адміністративний і внутрішній маршрут. Переконайся, що викликач справді є адміністратором з довіреного джерела (роль на сервері, а не поле, яке може встановити користувач), і що внутрішні маршрути недоступні з публічного інтернету.
- Ізолюй орендарів. У мультитенантному застосунку кожен запит і кожен шлях до файлу має бути обмежений тенантом викликача через один спільний вузол, щоб один клієнт ніколи не міг дістатися до даних чи файлів іншого.
- Обмежуй шляхи до файлів. Коли запит називає файл, визнач його повний шлях і переконайся, що він лишається в дозволеній директорії, а перевірка зупиняється на роздільнику шляху, щоб сусідня папка з довшою назвою не була доступна.
Як тестувати
- Створи два облікові записи. Під обліковим записом A запитай id об'єктів облікового запису B напряму. Жодних даних B не має повернутися.
- Викличи адміністративний маршрут токеном звичайного користувача. Очікуй 403.
- Надішли на будь-яку кінцеву точку файлів запити у стилі
../та з шляхами- префіксами сусідніх папок.