#php #security #cookies
#php #Безопасность #файлы cookie
Вопрос:
У меня есть метод, в котором я проверяю правильность имени пользователя и пароля (хэш соль). После этого, и если у пользователя есть доступ, я делаю:
if(isset($remember) amp;amp; $remember == '1') {
setcookie('email', $email, time() 60*60*24*100);
}
else {
setcookie('email', $email, time() 3600);
}
Мой вопрос касается проблем безопасности. приведенный выше код небезопасен? Нужно что-то вроде подписи?
например:
$user_email = $email;
$hash = sha1(rand(0,500).microtime());
$signature = sha1($hash . $user_email);
$cookie = base64_encode($signature . "-" . $hash . "-" . $user_email);
setcookie('authentication', $cookie);
Что вы думаете?
Комментарии:
1. Как вы проверяете, вошел ли кто-нибудь в систему?
2. ну, я только проверяю, был ли файл cookie определен (isset) или пуст
3. О, это очень небезопасно, потому что очень просто вручную установить файл cookie в браузере!!
4. почему вы не используете $_SESSIONS?
Ответ №1:
Вам нужно проверить случайно сгенерированный хэш или что-то еще на стороне сервера. Пользователь может сколько угодно корректировать данные и отправлять все, что угодно, обратно для данных cookie. С вашей текущей схемой, кажется, было бы легко указать любого пользователя, которого они хотели. Страшно.
Когда они войдут в систему, вставьте ключ аутентификации в базу данных вместе с IP, UserAgent и сроком действия. Если они пытаются использовать ваш сайт, а IP-адрес или пользовательский агент отличаются, или срок действия ключа истек, принудительно выполните выход.
Ответ №2:
Время для анекдота: примерно в 2002 году я просматривал дамп пакетов из сети моей школы и сказал им, что им нужно исправить свои оценки, посещаемость, информацию об учениках, систему «все под солнцем». Способ, которым они это настроили, был таким, что после аутентификации пользователя система устанавливала cookie только с именем пользователя и истечением срока действия сеанса. Я запустил браузер, выбрал имя пользователя (первый инициал, фамилия) и установил его как файл cookie. У меня был доступ.
Что они должны были сделать, так это установить случайное число 128 и отслеживать его на сервере (номер, соответствующий пользователь, значение тайм-аута).
Смотрите также
Ответ №3:
Чтобы легко запретить пользователю изменять значения файлов cookie, вы можете использовать этот класс, найденный в Интернете. Он запишет файл cookie, содержащий хэш, соответствующий «сумме» всех значений файлов cookie, поэтому, если вы измените данные, хэш будет неверным.
Необходимы только три метода: Cookie::set(cookie_name, value)
, Cookie::get(cookie_name)
и Cookie::reset()
.