PHP "Помни меня", недостаток безопасности?
Я нахожусь в середине кодирования формы с именем "запомнить меня", и до сих пор учебные пособия, которые я прочитал (частично, чтобы убедиться, что я делаю это правильно), все говорят, чтобы сохранить зашифрованный пароль в cookie вместе с именем пользователя. Затем каждый раз, когда PHP проверяет, не текут ли текущий пользователь, проверьте их файлы cookie и найдите эти значения. Если имя пользователя совпадает с паролем, вы находитесь.
Для меня это зияющая дыра в безопасности. Если кто-то должен взломать базу данных или каким-то образом получить доступ к зашифрованным паролям, их даже не нужно будет взламывать. Просто установите свои собственные файлы cookie и идите. Я прав, или просто параноик?
Моя система входа в систему использует сеансы для отслеживания текущего идентификатора пользователя и 1/0 для быстрой регистрации/выхода из системы. Пользователь не может редактировать сеансы AFAIK, так что это безопасно (если нет, сообщите мне). Я думал просто хранить идентификатор сеанса в файле cookie, чтобы потом возобновить его, но это также не защищено.
Я очень забочусь о безопасности своих пользователей, как я могу правильно защитить их информацию, сохраняя при этом действующий веб-сайт?
Ответы
Ответ 1
Обычно, когда серверу требуется запомнить пользователя, он выдает дополнительный файл cookie рядом с обычным файлом cookie сеанса, и эта новая строка содержит имя пользователя и разумное количество случайных символов, которые делают его неопознанным. Это, очевидно, сохраняется в базе данных (по соображениям безопасности вы можете обращаться с ним как с паролем и, следовательно, с солью и хешем), и в следующий раз, когда пользователь подключится к тому же браузеру (при условии, что старый сеанс истек), приложение получает случайная строка, проверяет базу данных, и если есть совпадение с аутентификацией пользователя.
Альтернативой является перемещение времени истечения сеанса перед некоторой суммой.
Каковы дыры в безопасности здесь? Если вы используете хороший случайный генератор, единственное, что может случиться, - это то, что пользователь обращается к приложению из общего браузера и не выходит из него вручную, когда он заканчивается.
Нормальные правила всегда применяются, так как вы находитесь на небезопасном канале: используйте HTTPS, иначе любой, кто находится между вашим компьютером и сервером, может украсть файлы cookie (либо сеансовый, либо один-на-один) и действовать так, как если бы это было вы.
Бонус, это необходимо прочитать Джеффу Этвуду
Ответ 2
Никогда не сохранять пароли каким-либо образом (зашифрованный пароль, который может использоваться для входа в систему, по-прежнему является паролем) на клиенте.
Использовать случайно сгенерированный ключ, безопасно сохраненный на сервере. Эти ключи могут быть отменены позже, в отличие от зашифрованных паролей, которые будут действительны до изменения.
Используя php, вы можете генерировать случайный ключ, подобный этому md5(uniqid(mt_rand(), true))
. Для лучшего хранения безопасности он солен и хэширован в дБ.
Пример таблицы:
login_keys (
user_id int,
key char(40), # sha1
salt char(15)
)
Также обратите внимание, что вы должны включить опцию cookie только для HTTP.
Ответ 3
Если вы хотите, чтобы это было безопасно, не позволяйте своим пользователям сохранять их в системе.
При настройке сеанса обязательно привяжите ipaddress к идентификатору сеанса, так что, если кто-то заберет сеанс позже, это может быть сделано только с одного и того же адреса Ip.
Yo может сделать это, сохранив базу данных с (хэшированной) сессией ids + hashed ipaddresses.
Я использую функцию phps http://php.net/manual/en/class.sessionhandler.php, чтобы установить обработчик сеанса и сопоставить сеансы с ipaddresses.
Ответ 4
Я столкнулся с этой же проблемой при работе на моем собственном веб-сайте, лучшим способом, который я нашел для ее решения, было просто не запоминать пароли, а только имена пользователей, обеспечивая более быстрый журнал, но не менее безопасный. Дело в том, что нет надежного способа защиты паролей. Кроме того, в новых браузерах пользователь может запомнить их браузер.
Но если у вас должен быть сохраненный пароль, попробуйте следующее:
Имейте несколько файлов cookie, 2 будет самым простым и используйте один для зашифрованного пароля, а другой - ключ шифрования. Пароль в базе данных будет содержать еще один зашифрованный пароль, полученный с помощью сохраненного ключа (ов) шифрования. Когда вы будете готовы проверить пароль, извлеките значения и зашифруйте пароль.
Надеюсь, это было полезно. Удачи!
Изменить: Возможно, я неправильно понял это, если пользователь все еще зарегистрирован, рекомендуется сохранять переменную сеанса.