Автентифікація та сесії
Як користувачі доводять, хто вони, і як ти тримаєш їх у системі, не віддаючи зловмиснику ключі. Це найбільш атакована поверхня будь-якого застосунку.
Чек-лист
- Хешуй паролі повільним алгоритмом із сіллю. Використовуй bcrypt, scrypt або Argon2, ніколи простий SHA чи MD5, і ніколи не зберігай паролі у відкритому вигляді. Якщо ти можеш прочитати пароль користувача, зловмисник із доступом до твоєї бази теж може.
- Обмеж спроби входу та скидання. Обмеж кількість спроб на IP та на обліковий запис (наприклад, десять за п'ятнадцять хвилин), а потім повертай 429. Без цього перебір паролів тривіальний.
- Не розкривай, які електронні адреси існують. Вхід, реєстрація та скидання пароля мають повертати однакову загальну відповідь незалежно від того, чи існує обліковий запис, з однаковим часом відповіді та однаковими кодами статусу.
- Роби токени скидання та підтвердження короткоживучими та одноразовими. Одна година або менше, анулюються після використання. Стався до них як до паролів.
- Прив'яжи потік OAuth до браузера, який його почав. Якщо входиш через Google,
GitHub або подібні сервіси, збережи значення
stateу cookie під час початкового запиту і звіряй його під час callback. Без такої прив'язки зловмисник може надіслати жертві посилання, яке увійде жертву в обліковий запис зловмисника (login-CSRF). Див. API та запити. - Перевіряй відповідь провайдера ідентифікації. Вимагай підтверджену електронну пошту, перевіряй audience й issuer токена і ніколи не довіряй ідентифікатору, який надіслав клієнт.
- Якщо пропонуєш багатофакторну автентифікацію, захищай другий крок першим. Другий фактор має бути доступний лише після успішної перевірки пароля, з одноразовим викликом, інакше простір кодів можна перебрати окремо.
- Завершуй сесії за часом і підтримуй відкликання. Став розумний термін дії токена і зроби так, щоб зміна пароля анулювала всі наявні сесії.
- Перевіряй пароль за списком зламаних паролів (наприклад, API HIBP з k-анонімністю) під час реєстрації та скидання.
Як тестувати
- Зроби п'ятдесят неправильних входів у скрипті і переконайся, що тебе обмежують.
- Порівняй відповідь на скидання для справжньої та вигаданої електронної адреси. Вони мають бути ідентичними.
- Почни вхід через OAuth в одному браузері, заверши його в іншому. Він має завершитися з помилкою.