Заглянув в нашу систему входа в систему, чтобы добавить некоторые новые функции, я обнаружил, что она не очень безопасна. Auth cookie был шифрованием user id, stamp, version, PASSWORD IN THE RAW, and a cookie id
По крайней мере, я могу сказать, что я не тот, кто сделал это так, как предыдущий разработчик. (Да, я знаю, что пароль должен быть сохранен в виде хэша в базе данных, а не в виде простого текста. Первоначальный разработчик сделал это таким образом, и я еще не исправил это.)
Итак, я много читал о безопасном входе в систему и о безопасных файлах cookie здесь и в Интернете. Я вижу, как легко это сделать не безопасно.
О сайте
- это сайт электронной коммерции, на котором также есть много общественных вещей (доска объявлений, галерея)
- страница входа принудительно HTTPS
- все страницы учетной записи и оформление заказа также принудительно HTTPS
- текущий пароль необходим для изменения пароля или адреса электронной почты
Вот мой план:
Цели:
- может быть зарегистрировано более чем в одном месте
- требуется перерегистрация для защищенных частей магазина, только длится 30-60 минут, cookie-файлы установлены только в безопасном режиме
- возможность видеть все текущие логины
- возможность выхода из системы во всех местах
бэкэнд-вход безопасен и длится дольше. ограниченный вход за пределами офиса
user gets page:
no auth:
have user sign in with username & pass
create new token
expires =
https on store: 30-60 min
backend in office: 5 days
backend remote: 30-60 min?
regular without remember me: session or 24 hours?
regular with remember me: 30 days
insert into user_session
set cookie
auth:
token in db:
set uid
generate new token, new expires, insert into DB, remove old?
upddate cookie
token not in db:
logout, requre sign in
table user_session:
uid
uid_as (for being 'logged in' as another user, admin feature only)
token
type
ip address
expires
stamp
cookie value: token|hash(token + user id, server key)
Из всего, что я прочитал, это то, что я придумал. Я чувствую, что я что-то упустил, хотя. Есть ли проблемы с моим планом или способами сделать его более безопасным, кроме использования HTTPS для всего сайта? (в настоящее время это вызовет некоторые проблемы, но я рассмотрю это позже)