вход на веб-сайт и выход из системы

#php #session #cookies #mysqli

#php #сессия #файлы cookie #mysqli

Вопрос:

Мой веб-сайт использует файлы cookie для входа и выхода из системы, кажется, он работает нормально, но я уверен, что есть некоторые проблемы с безопасностью, о которых я не знаю. Я надеюсь на любые комментарии или понимание, которые могли бы сделать это более безопасным.

Вход:

 if(isset($_REQUEST['email']) amp;amp; isset($_REQUEST['password'])) {
    if ($result = $usersqli->query("SELECT * FROM users WHERE email='".$usersqli->real_escape_string($_POST['email'])."' AND password='".$usersqli->real_escape_string($_POST['password'])."'")) {
        if ($result->num_rows==1){
            $row = $result->fetch_object();
            $_SESSION["uid"]=$row->id;
            setcookie('email', $usersqli->real_escape_string($_REQUEST['email']), time() 60*60*24*365,'/');
            setcookie('password', md5($_REQUEST['password']), time() 60*60*24*365,'/');
            $usersqli->query("UPDATE users SET last_login=NOW() WHERE  email='".$usersqli->real_escape_string($_POST['email'])."' AND password='".$usersqli->real_escape_string($_POST['password'])."'"); 
            header( 'Location: index.php' ) ;
        }else{
            header( 'Location: index.php?show=loginamp;err=Invalid login credentials' ) ;
        }
    }

}
  

Выход:

     setcookie('email','', time() - 60000);
    setcookie('password', '', time() - 60000);
    session_destroy();
    header("Location: index.php");  
  

Заголовок каждой страницы:

 if(!$_SESSION[uid] amp;amp; $_REQUEST[show]!='logout'){
    if (isset($_COOKIE['email']) amp;amp; isset($_COOKIE['password'])) {  
        if ($result = $usersqli->query("SELECT * FROM users WHERE email='".$usersqli->real_escape_string($_COOKIE['email'])."'")) {
            if ($result->num_rows==1){
                $row = $result->fetch_object();
                if(md5($usersqli->real_escape_string($row->password))==$_COOKIE['password']){
                    $_SESSION["uid"]=$row->id;          
                }
             }
         }
    }
}
  

Комментарии:

1. Конечно, первая проблема заключается в том, чтобы заставить его работать, когда у пользователя не включены файлы cookie.

2. Или, по крайней мере, предупредите пользователя, что им необходимо включить cookies для использования веб-сайта

3. Хм … для начала не похоже, чтобы пароль помещался в ваш файл cookie

4. я скажу пользователям включить cookies, я об этом не подумал. что касается ввода пароля в cookie, вот как они это сделали в примере, который я прочитал. автор утверждал, что это безопасно, потому что оно было сохранено как md5. вы не согласны?

5. Что ж, глядя на ваш пример, если я могу позаимствовать ваш компьютер и посмотреть ваши файлы cookie, я могу войти в систему под вашим именем. Если вы собираетесь использовать cookies, сохраняйте только значение, связанное с этим сеансом — другими словами, как только пользователь выходит из системы, значения, сохраненные в cookie (которые должны были быть удалены), становятся бессмысленными.

Ответ №1:

Не храните пароль в cookie-файлах — основные меры безопасности отсутствуют. Существует множество статей о том, как это сделать.

Комментарии:

1. даже если это MD5? я думал, что невозможно превратить MD5 обратно в исходную строку

2. Я думаю, что эти строки здесь: if (!$_SESSION [uid] amp;amp; $_REQUEST [show]!=’logout’){ if (isset ($_COOKIE[’email’]) amp;amp; isset ($ _COOKIE[‘password’])) в основном позволят мне войти в систему, скопировав ваш файл cookie. Даже после того, как вы вышли из системы. Если только я чего-то не вижу…

3. Теперь я полностью понимаю, что вы имеете в виду, а также что делать! Спасибо!

Ответ №2:

Здесь у вас проблемы с фиксацией сеанса в обоих механизмах аутентификации.

Я не вижу явной функции session_start().

Почему 2 отдельных файла cookie?

Хотя хэш пароля md5 означает, что кто-то не может узнать исходный пароль, ничто не мешает им узнать хэш пароля, который работает так же хорошо, чтобы предоставить им доступ. Запуск этого через SSL не поможет, но установка флагов secure и http only для файлов cookie решит последнюю проблему.

Комментарии:

1. сеанс запускается в заголовке страницы. я использовал два файла cookie, потому что в примере, который я нашел, использовались два файла cookie. я понимаю, что хэш все еще уязвим, чтобы разрешить другим доступ, если у них был хэш. но на самом деле, не имело бы значения, был ли хэш паролем или нет, все, что им нужно, это доступ к нему, и я не вижу способа обойти это. я посмотрю на флаги http only. Спасибо

2. Использование механизма запроса для аутентификации на основе пароля (например, использование javascript для хэширования пароля с помощью cookie сеанса) в сочетании с мерами ant-фиксации (когда представлен идентификатор сеанса, который не соответствует истекшему сеансу, принудительно введите новый идентификатор сеанса) позволило бы предотвратить повторные атаки. Принудительное использование нового идентификатора сеанса при аутентификации (любым способом) предотвратило бы исправление. Использование случайного значения для токена ‘remember me’ и сохранение его вместе с записью пользователя в базе данных предотвратило бы повторные атаки