Стара нитка, але все ж дійсна турбота. Я помітив кілька хороших відповідей щодо безпеки та уникнення використання "безпеки через невідомість", але фактичні технічні методи, надіслані в моїх очах, були недостатніми. Що я повинен сказати, перш ніж внести свій внесок у метод:
- НІКОЛИ не зберігайте пароль чітким текстом ... ВСЕ!
- НІКОЛИ не зберігайте хешований пароль користувача у більш ніж одному місці вашої бази даних. Ваш серверний сервер завжди може витягнути хешований пароль із таблиці користувачів. Зберігати зайві дані замість додаткових транзакцій БД не є більш ефективним, зворотне - це правда.
- Ваш ідентифікатор сеансу повинен бути унікальним, так що ніякі два користувача не могли коли - або поділитися ID, отже , призначення ідентифікатора (може Ліцензія ідентифікаційний номер вашого водія коли - або відповідати іншим особам? Ні . ) Це створює двосекційний унікальне поєднання, засноване на 2 унікальні струни. Ваша таблиця сеансів повинна використовувати ідентифікатор як ПК. Щоб дозволити довіряти декілька пристроїв для автоматичного входу, використовуйте іншу таблицю для надійних пристроїв, яка містить список усіх перевірених пристроїв (див. Мій приклад нижче) та відображається за допомогою імені користувача.
- Він не призначений для хешування відомих даних у файл cookie, файл cookie можна скопіювати. Ми шукаємо відповідний користувальницький пристрій для надання автентичної інформації, яку неможливо отримати, якщо зловмисник не загрожує машині користувача (ще раз див. Мій приклад). Це означатиме, однак, що законний користувач, який забороняє статичну інформацію про свою машину (тобто MAC-адресу, ім'я хоста пристрою, useragent, якщо обмежений браузером тощо), залишатися послідовним (або в першу чергу підробляє його) не зможе використовувати цю функцію. Але якщо це викликає занепокоєння, врахуйте той факт, що ви пропонуєте автоматичне вхід користувачам, які ідентифікують себе однозначно, тому, якщо вони відмовляються бути відомими, підробляючи MAC, підробляючи їх засіб, підробляючи / змінюючи ім'я хоста, ховаючись за проксі-серверами тощо, вони не піддаються ідентифікації та ніколи не повинні бути автентифіковані для автоматичного обслуговування. Якщо ви цього хочете, вам потрібно ознайомитися з доступом до смарт-карт у комплекті з програмним забезпеченням на стороні клієнта, який встановлює особу використовуваного пристрою.
Незважаючи на це, є два чудових способи автоматичного входу в систему.
По-перше, дешевий, простий спосіб, який ставить усе це на когось іншого. Якщо ви зробите підтримку свого веб-сайту входом у систему, скажімо, своїм обліковим записом google +, у вас, ймовірно, є спрощена кнопка google +, яка ввійде користувач, якщо він уже ввійшов у google (я це зробив тут, щоб відповісти на це запитання, як я завжди увійшли в google). Якщо ви хочете, щоб користувач автоматично входив, якщо він уже входив з довіреним і підтримуваним автентифікатором, і встановив прапорець, щоб ваші сценарії на стороні клієнта виконували код за відповідною кнопкою "вхід з" перед завантаженням , не забудьте, щоб сервер зберігав унікальний ідентифікатор у таблиці автоматичного входу, що містить ім’я користувача, ідентифікатор сесії та автентифікатор, що використовується для користувача. Оскільки ці методи входу використовують AJAX, ви все одно чекаєте відповіді, і ця відповідь є або підтвердженою відповіддю, або відхиленням. Якщо ви отримали підтверджену відповідь, використовуйте її як звичайну, а потім продовжуйте завантажувати зареєстрованого користувача як звичайного. Інакше вхід не вдався, але не повідомляйте користувачеві, просто продовжуйте, як не входили в систему, вони помітять. Це робиться для того, щоб зловмисник, який викрав файли cookie (або підробив їх у спробі ескалації привілеїв), не дізнався, що користувач автоматично підписується на сайт.
Це дешево, а хтось також може вважати його брудним, оскільки він намагається перевірити потенційно вже зареєстровану себе в таких місцях, як Google та Facebook, навіть не повідомивши вам. Однак він не повинен використовуватися для користувачів, які не просили авторизуватися на вашому веб-сайті, і цей конкретний метод застосовується лише для зовнішньої аутентифікації, як, наприклад, у Google+ або FB.
Оскільки зовнішній аутентифікатор був використаний для того, щоб повідомити серверу за лаштунками, чи був користувач перевірений чи ні, зловмисник не може отримати нічого, крім унікального ідентифікатора, який сам по собі марний. Я докладно:
- Користувач "joe" відвідує сайт вперше, ідентифікатор сесії розміщений у файлі cookie "сеанс".
- Користувач 'joe' входить у систему, збільшує привілеї, отримує новий ідентифікатор сесії та відновлює 'сеанс cookie'.
- Користувач 'joe' обирає автоматичний вхід за допомогою Google +, отримує унікальний ідентифікатор, розміщений у файлі cookie 'Keepmesignedin'.
- Користувач 'joe' має google підтримувати їх увімкнутими, що дозволяє вашому сайту автоматично входити в систему користувача, використовуючи google у вашому бекенді.
- Зловмисник систематично пробує унікальні ідентифікатори для "Keepmesignedin" (це загальнодоступні знання, що роздаються кожному користувачеві), і не входить ніде більше; намагається унікальний ідентифікатор, наданий 'joe'.
- Сервер отримує унікальний ідентифікатор для 'joe', тягне відповідність у БД для облікового запису google +.
- Сервер надсилає Attacker на сторінку входу, яка виконує запит AJAX, щоб Google входив у систему.
- Сервер Google отримує запит, використовує його API, щоб побачити, що Нападник наразі не входить у систему.
- Google надсилає відповідь про те, що наразі користувач не ввійшов через цей зв’язок.
- Сторінка зловмисника отримує відповідь, сценарій автоматично перенаправляє на сторінку входу зі значенням POST, закодованим у URL-адресі.
- Сторінка входу отримує значення POST, надсилає файл cookie для 'Keepmesignedin' в порожнє значення та діє до дати 1-1-1970 для запобігання автоматичній спробі, внаслідок чого браузер Attacker просто видаляє файл cookie.
- Зловмиснику надається звичайна сторінка для першого входу.
Незважаючи ні на що, навіть якщо зловмисник використовує ідентифікатор, який не існує, спроба має бути невдалою при всіх спробах, за винятком випадків, коли отримана підтверджена відповідь.
Цей спосіб можна і потрібно використовувати спільно з вашим внутрішнім автентифікатором для тих, хто входить на ваш сайт за допомогою зовнішнього аутентифікатора.
=========
Тепер для вашої власної системи аутентифікаторів, яка може автоматично підписувати користувачів, ось так я це роблю:
У БД є кілька таблиць:
TABLE users:
UID - auto increment, PK
username - varchar(255), unique, indexed, NOT NULL
password_hash - varchar(255), NOT NULL
...
Зауважте, що ім'я користувача може містити 255 символів. У мене в серверній програмі обмежуються імена користувачів на 32 символи, але зовнішні автентифікатори можуть мати імена користувачів з їх доменом @ domain.tld більше, ніж я, тому я просто підтримую максимальну довжину адреси електронної пошти для максимальної сумісності.
TABLE sessions:
session_id - varchar(?), PK
session_token - varchar(?), NOT NULL
session_data - MediumText, NOT NULL
Зауважте, що в цій таблиці немає поля користувача, тому що ім’я користувача при вході в систему знаходиться в даних сеансу, а програма не дозволяє нульові дані. Session_id та session_token можна згенерувати за допомогою випадкових хедів md5, хешів sha1 / 128/256, дат часу та випадкових рядків, доданих до них, потім хешованих, або будь-що, що ви хочете, але ентропія вашого результату повинна залишатися настільки ж високою, як і допустима пом'якшити грубі сили нападів навіть від підйому, і всі хеші, згенеровані вашим сеансовим класом, повинні перевірятись на відповідність у таблиці сесій до спроби їх додати.
TABLE autologin:
UID - auto increment, PK
username - varchar(255), NOT NULL, allow duplicates
hostname - varchar(255), NOT NULL, allow duplicates
mac_address - char(23), NOT NULL, unique
token - varchar(?), NOT NULL, allow duplicates
expires - datetime code
MAC-адреси за своєю природою повинні бути УНІКАЛЬНІМ, тому має сенс, що кожен запис має унікальне значення. З іншого боку, імена хостів можуть бути законно скопійовані в окремих мережах. Скільки людей використовують "Домашній ПК" як одне із своїх імен на комп'ютері? Ім'я користувача беруть із даних сеансу серверний бекенд, тому маніпулювати ним неможливо. Що стосується маркера, для генерування жетонів у файлах cookie для автоматичного входу користувача слід використовувати той самий спосіб генерування жетонів сеансу для сторінок. Нарешті, додається код дати, коли користувачеві потрібно буде повторно підтвердити свої облікові дані. Або оновіть цей час для входу користувача, зберігаючи його протягом декількох днів, або примушуйте його закінчувати, незалежно від останнього входу, зберігаючи його протягом місяця або близько того, що диктує ваш дизайн.
Це не дозволяє комусь систематично підробляти MAC та ім'я хоста для користувача, якого він знає, автоматично підписується. Ніколинехай користувач зберігає файл cookie зі своїм паролем, чистим текстом чи іншим способом. Регенеруйте маркер на кожній навігації по сторінці, як і маркер сеансу. Це значно знижує ймовірність того, що зловмисник може отримати дійсне cookie-маркер і використовувати його для входу. Деякі люди спробують сказати, що зловмисник може вкрасти файли cookie у жертви і зробити сеанс повторної атаки для входу. Якщо зловмисник міг би вкрасти файли cookie (що можливо), вони, безумовно, поставили б під загрозу весь пристрій, це означає, що вони могли просто використовувати пристрій для входу в будь-який момент, що перешкоджає цілі крадіжки файлів cookie. Поки ваш сайт працює над HTTPS (що він повинен мати при роботі з паролями, номерами CC або іншими системами входу), ви забезпечили користувачеві весь захист, який ви можете мати в браузері.
Слід пам’ятати: дані сеансу не повинні закінчуватися, якщо ви використовуєте автоматичний вхід. Ви можете закінчити можливість помилкового продовження сеансу, але перевірка в системі повинна відновити дані сеансу, якщо це стійкі дані, які, як очікується, продовжуватимуться між сесіями. Якщо ви хочете отримувати як стійкі, так і непостійні дані сеансу, використовуйте іншу таблицю для постійних даних сеансу з іменем користувача як ПК, а сервер повинен отримати його так, як це були б звичайні дані сеансу, просто використовуйте іншу змінну.
Після того, як реєстрація буде досягнута таким чином, сервер все ще повинен перевірити сеанс. Тут ви можете кодувати очікування для викрадених або порушених систем; шаблони та інші очікувані результати входу в дані сеансу часто можуть призвести до висновків про те, що система була викрадена або підроблені файли cookie, щоб отримати доступ. Тут ваша ISS Tech може встановити правила, які спричинить блокування облікового запису або автоматичне видалення користувача з системи автоматичного входу, утримуючи зловмисників достатньо довго, щоб користувач міг визначити, як зловмисник досяг успіху, і як їх знищити.
Як завершальне зауваження, будьте впевнені, що будь-яка спроба відновлення, зміна пароля або помилка входу через поріг призводять до відключення автоматичного входу до тих пір, поки користувач не перевірить належним чином і не підтвердить, що це сталося.
Прошу вибачення, якщо хтось очікував, що у моїй відповіді буде видано код, це не відбудеться тут. Я скажу, що я використовую PHP, jQuery і AJAX для запуску своїх сайтів, і я НІКОЛИ не використовую Windows як сервер ... ніколи.