У своїй статті Трой Хант відзначає кілька чудових моментів - все, що ви хотіли знати про створення функції безпечного скидання пароля . Найбільш релевантні уривки:
[T] ось два загальних підходу:
- Створіть новий пароль на сервері та надішліть його електронною поштою
- Надішліть унікальну URL-адресу електронною поштою, яка полегшить процес скидання
Незважаючи на безліч вказівок на протилежне, перший пункт насправді не там, де ми хочемо бути. Проблема з цим полягає в тому, що він означає постійний пароль - той, з яким ви можете повернутися і використовувати будь-який час - зараз надісланий через незахищений канал і знаходиться у вашій папці "Вхідні".
...
Але є ще одна велика проблема першого підходу в тому, що він робить простий шкідливий блокування облікового запису простим. Якщо я знаю адресу електронної пошти того, хто володіє обліковим записом на веб-сайті, то я можу їх заблокувати з них, коли мені потрібно, просто скинувши їх пароль; це відмова в службовій атаці, що подається на срібному блюді! Ось чому скидання - це те, що має відбутися лише після успішної перевірки права запитувача на це.
Коли ми говоримо про URL-адресу скидання, ми говоримо про адресу веб-сайту, яка є унікальною для цього конкретного примірника процесу скидання.
...
Що ми хочемо зробити, це створити унікальний маркер, який можна надіслати електронною поштою як частину URL-адреси скидання, а потім відповідати запису на сервері поряд з обліковим записом користувача, підтверджуючи, що власник облікового запису електронної пошти справді намагається скинути пароль. Наприклад, маркер може бути "3ce7854015cd38c862cb9e14a1ae552b" і зберігається в таблиці поряд з ідентифікатором користувача, який виконує скидання, і тим часом, коли генерується маркер (більше про це за мить). Коли електронний лист надсилається, він містить таку URL-адресу, як "Скинути /? Id = 3ce7854015cd38c862cb9e14a1ae552b", і коли користувач завантажує це, сторінка перевіряє наявність токена і, отже, підтверджує особу користувача та дозволяє пароль бути зміненим.
...
Інша річ, яку ми хочемо зробити з URL-адресою скидання - це обмежити час маркування, щоб процес скидання повинен бути завершений протягом певної тривалості, скажімо, протягом години.
...
Нарешті, ми хочемо переконатися, що це разовий процес. Після завершення процесу скидання маркер слід видалити, щоб URL-адреса скидання більше не функціонувала. Як і в попередньому пункті, це полягає в тому, щоб зловмисник мав обмежене вікно, в якому вони можуть зловживати URL-адресою скидання. Плюс, звичайно, маркер більше не потрібен, якщо процес скидання успішно завершився.
Він робить ще багато хороших моментів щодо уникнення витоків інформації, CAPTCHA, двофакторної аутентифікації та, звичайно, основних найкращих практик, таких як хешування паролів. Я думаю, що важливо відзначити, що я не погоджуюся з Троєю щодо корисності питань безпеки, віддаючи перевагу скептицизму Брюса Шнейера до цієї практики :
Суть усіх цих питань однакова: резервний пароль. Якщо ви забудете свій пароль, секретне запитання може підтвердити вашу особу, щоб ви могли вибрати інший пароль або надіслати веб-сайт електронною поштою свій поточний пароль. Це прекрасна ідея з точки зору обслуговування клієнтів - користувач рідше забуде ім’я свого першого улюбленця, ніж якийсь випадковий пароль - але страшний для безпеки. Відповідь на секретне питання набагато простіше здогадатися, ніж хороший пароль, а інформація набагато більш публічна.