Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сервлеты и кукисы, Сеанс юзера доступен всем вошедшим 
:(
    Опции темы
tolet
Дата 6.11.2008, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 24.9.2006
Где: Москва

Репутация: нет
Всего: нет



Добрый день Всем!

Ситуация такая: пользователь веб-приложения логинится на сервере - все проходит удачно (связывается с БД, проверяется логин и пароль). После этого кто-то другой заходит на тоже самое веб-приложение - и сразу попадает в сеанс только что залогиненного (не свой сеанс)! Выйти из его сеанса не может. Все данные логина и пароля передаются сервлетами через кукисы. Подскажите в чем может быть загвоздка и как ее можно обойти.

Заранее благодарен за ответ.
PM MAIL WWW ICQ   Вверх
necromancer
Дата 6.11.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



причин может быть несколько как мне кажется:
1 не правильное упраление куками
2 кто то на промежуточном уровне кэшит куки? насчет этого не уверен
3 сессия всегда одна, по причине реализации сервлета как синглетона =)
4 какая то другая причина.


вообще без кода похоже на гадание по кофейной гуще.

PS А вот у меня прыщик, что это может быть? =)


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
tolet
Дата 6.11.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 24.9.2006
Где: Москва

Репутация: нет
Всего: нет



Выжимка с кода:

Код

private String login;
private String password;
private String language;
private String dealer;
private String currancy;

private void cookiesManager(HttpServletRequest request, HttpServletResponse response)
    {
        Cookie[] cookies = request.getCookies();
        if (cookies != null)
        {
            for (int i=0; i<cookies.length; i++)
            {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("login")) login = cookie.getValue();
                if (cookie.getName().equals("password")) password = cookie.getValue();
                if (cookie.getName().equals("language")) language = cookie.getValue();
                if (cookie.getName().equals("dealer")) dealer = cookie.getValue();
                if (cookie.getName().equals("currancy")) currancy = cookie.getValue();
                if (cookie.getName().equals("lastvisit")) lastvisit = cookie.getValue();
            }
                
                if (login == null) { login = "guest"; response.addCookie(new Cookie("login", login));}
                
                if (password == null) { password = "000000"; response.addCookie(new Cookie("password", password)); }
                
                if (language == null) 
                {
                    language = "RUS";
                    Cookie c1 = new Cookie("language", language);
                    c1.setMaxAge(2592000);
                    response.addCookie(c1);
                }
                if (dealer == null)
                {
                    dealer = "1";
                    Cookie c2 = new Cookie("dealer", dealer);
                    c2.setMaxAge(2592000);
                    response.addCookie(c2);
                }
                if (currancy == null)
                {
                    currancy = "1";
                    Cookie c3 = new Cookie("currancy", currancy);
                    c3.setMaxAge(2592000);
                    response.addCookie(c3);
                }
            
        }else
        {
            login = "guest"; Cookie c1 = new Cookie("login", login); response.addCookie(c1);
            password = "000000"; Cookie c2 = new Cookie("password", password); response.addCookie(c2);
            language = "RUS"; Cookie c3 = new Cookie("language", language); c3.setMaxAge(2592000); response.addCookie(c3);
            dealer = "1"; Cookie c4 = new Cookie("dealer", dealer); c4.setMaxAge(2592000); response.addCookie(c4);
            currancy = "1"; Cookie c5 = new Cookie("currancy", currancy); c5.setMaxAge(2592000); response.addCookie(c5);
        }
    }

PM MAIL WWW ICQ   Вверх
necromancer
Дата 6.11.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



ага! а теперь ставим FireFox и смотрим что именно идет от клиентов к серверу.
Могу предположить, что второй пользователь получает логин guest и идет дальше как зарегистрированный пользователь =)

код записи/чтения мы увидели, а код зависящий от этих манипуляций нет, т.е. код менеджера безопастности в студию.

PS на будущее , хранить пароль юзера в куках - зло.
Хранить какие либо данный о пользователе в куках зло!

Предположим что у тебя юзер имел роль dialer, ты поменял ему роль, но после того как он придет с куками, он снова будет диалер? =)


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
Asal
Дата 6.11.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 26.12.2006
Где: Минск

Репутация: 4
Всего: 7



Цитата(necromancer @  6.11.2008,  12:58 Найти цитируемый пост)
PS на будущее , хранить пароль юзера в куках - зло.Хранить какие либо данный о пользователе в куках зло!

а как по другому реализовать галочку "запомнить меня"


--------------------
PM MAIL ICQ   Вверх
tolet
Дата 6.11.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 24.9.2006
Где: Москва

Репутация: нет
Всего: нет



Цитата(necromancer @  6.11.2008,  12:58 Найти цитируемый пост)
Предположим что у тебя юзер имел роль dialer, ты поменял ему роль, но после того как он придет с куками, он снова будет диалер? =) 

 dealer - это не роль юзера - из этой переменной формируется ближайший адрес дилера для зарегистрированного пользователя

Цитата(necromancer @  6.11.2008,  12:58 Найти цитируемый пост)
код менеджера безопастности в студию


Прошу прощения, я конечно могу показаться полным ламером (может я и на самом деле ламер - не учился я на программиста - изучаю все самостоятельно по книгам), но я не очень понимаю что имеется ввиду под менеджером безопасности. Это часть кода, которая проверяет параметры логина и пароля? или что?


Это сообщение отредактировал(а) tolet - 6.11.2008, 13:31
PM MAIL WWW ICQ   Вверх
necromancer
Дата 6.11.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



Цитата

Прошу прощения, я конечно могу показаться полным ламером (может я и на самом деле ламер - не учился я на программиста - изучаю все самостоятельно по книгам), но я не очень понимаю что имеется ввиду под менеджером безопасности. Это часть кода, которая проверяет параметры логина и пароля? или что?


ты привел код где идет чтение/запись куков. Хотеолсь бы увидеть место где используются полученные переменные.

to: Asal 
Достаточно хранить некое уникальное значение, желательно не несущее смысловой нагрузки, например некий UID (не PK) и уже понему делать какие то шаги по аутентификации юзера.

Смоделируем ситуацию:
Злоумышленник поставил перед вашим сервером свой прокси или снифер, через какой то промежуток времени у него будут ДОСТОВЕРНЫЕ данные о логинах и паролях.
В случае же если идет обмен неким ключем, то при смене пароля или канала злоумышленник не сможет воспользоватся сгенерированным UID, так как он может быть например привязан к IP клиента и/или дате действия.
Далее получив UID  и даже получив доступ к системе, злоумышленник не сможет поменять пароль, так как при его смене в нормальной системе всегда запрашивается старый =)

Доступно изъяснился? =)
конечно все это ерунда если делается домашняя страничка =) с доступом к интим фото :Р

PS на мой домашний портал кивать не стоит - используется стандартная процедура аутентификации через SEAM + нет времени на заморочки =)

Это сообщение отредактировал(а) necromancer - 6.11.2008, 13:55


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
tolet
Дата 6.11.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 24.9.2006
Где: Москва

Репутация: нет
Всего: нет



Вот код, где используется часть данных (все выложить постесняюсь - придется выкладывать весь сервлет):

Код

private void setRuLine_Hi() {
        String logn = null;
        String pswd = null;
        String lvis = null;

        String line1 = null;
        String line2 = null;
        String line3 = null;
        String line4 = null;
        String line5 = null;
        String line6 = null;

        try {
            Connection conn = DriverManager.getConnection(url, lgn, pas);
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT id_user, login, password, date(last_visit) as date, time(last_visit) as time FROM db_users WHERE login=\'" + login + "\'");
            while (rs.next()) {
                System.out.println("id_user="+id);
                id = rs.getInt("id_user");
                System.out.println("id_user="+id);
                logn = rs.getString("login");
                pswd = rs.getString("password");
                lvis = rs.getString("date") + "   " + rs.getString("time");
            }
            ResultSet rs2 = stmt.executeQuery("SELECT SUM(quantity) as quantity FROM db_buscket WHERE id_user=" + id + " group by id_user");
            String i = "0";
            while (rs2.next()) {
                i = rs2.getString("quantity");
            }
            ResultSet rs3 = stmt.executeQuery("SELECT COUNT(id_artwork) as artwork FROM db_wishlist WHERE id_user=" + id + " group by id_user");
            Integer i2 = 0;
            while (rs3.next()) {
                i2 = rs3.getInt("artwork");
            }
            ResultSet rs4 = stmt.executeQuery("SELECT COUNT(massage) as massage FROM db_massages WHERE id_user_to=" + id + " group by id_user_to");
            String i4 = "0";
            while (rs4.next()) {
                i4 = rs2.getString("massage");
            }
            ResultSet rs5 = stmt.executeQuery("SELECT cur_type FROM st_currancytypes WHERE id_curtype=" + currancy);
            while (rs5.next()) {
                line6 = new String("<a href=\"/servlet/Cabinet?ml1=6&ml2=36&ml3=104&ofst=0&pic=0\">" + rs5.getString("cur_type") + "</a>");
            }
            line3 = new String("<a href=\"/servlet/Basket?ml1=6&ml2=29&ml3=85&ofst=0&pic=0\">" + i + " предмет(-а, -ов)</a>");
            line4 = new String("<a href=\"/servlet/Cabinet?ml1=6&ml2=31&ml3=90&ofst=0&pic=0\">" + i2 + " предмет(-а, -ов)</a>");
            line5 = new String("<a href=\"/servlet/Cabinet?ml1=6&ml2=37&ml3=107&ofst=0&pic=0\">" + i4 + " сообщени(-е,-я,-й)</a>");
            if (pswd != null && pswd.equals(password)) {
                line1 = new String(logn + " | <a href=\"/servlet/Logout\">выход</a>");
                line2 = lvis;
            } else {
                line1 = new String("<a href=\"/servlet/Login\">вход</a> | <a href=\"/servlet/Registration\">регистрация</a>");
                line2 = new String("не зарегистрирован");
            }
            rs.close();
            rs2.close();
            rs3.close();
            rs4.close();
            rs5.close();
            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
        line_1_hi = new String("Пользователь: " + line1);
        line_2_hi = new String("Последнее посещение: " + line2);
        line_3_hi = new String("В корзине: " + line3);
        line_4_hi = new String("Отложенные: " + line4);
        line_5_hi = new String("Сообщения: " + line5);
        line_6_hi = new String("Валюта расчетов: " + line6);
    }


Это сообщение отредактировал(а) tolet - 6.11.2008, 14:14
PM MAIL WWW ICQ   Вверх
necromancer
Дата 6.11.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



ну опять ничего не понятно откуда сюда приходит login, как он выставляется.
Что это класс, вдруг он синглетон и ты после логина, НЕ очищаешь поля login и т.д.

PS на будущее:
Logger log =  Logger.getLogger(Main.class.getName());
перенести в инициализацию класса (там где объявляются глобальные переменные)

а при выпадении ошибки делать:
log.error(e);

так же посмотри как правильно оборачивать соединения в блоки try catch
Код

Connection con = null;
ps = null
rs =null...
try {
  .. do connect
   .. fetch data
} catch (Exception ..) {some excpetions handling}
finally {
    ..close con,ps,rs if they  not null
}



 Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT id_user, login, password, date(last_visit) as date, time(last_visit) as time FROM db_users WHERE login=\'" + login + "\'");

используй PrepareStatement
PrepareStatement ps = conn.createPrepareStatement("select ... from ... where login = ? ");
ps.setString(1,login);
ResultSet rs = ps.executeQuery();

PSS пора в отпуск =)



--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
tolet
Дата 6.11.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 24.9.2006
Где: Москва

Репутация: нет
Всего: нет



Цитата(necromancer @  6.11.2008,  14:20 Найти цитируемый пост)
ну опять ничего не понятно откуда сюда приходит login, как он выставляется.


эта переменная выставляется из кукисов (см. первый выложенный код)
Цитата(necromancer @  6.11.2008,  14:20 Найти цитируемый пост)
Что это класс, вдруг он синглетон и ты после логина, НЕ очищаешь поля login и т.д.


как можно понять синглтон это или нет?

PM MAIL WWW ICQ   Вверх
necromancer
Дата 6.11.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



должно работать просто примерно так:
метод 
Код

doPost(req,res) {
    Cookies c = getCookies();
    LoginCookie lc = fetchLoginData(c);
    new Login().login(lc);
}

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

тогда все будет примерно нормально. 

у тебя же видимо происходит такая ерунда, что после выставления переменной login она остается в данном сервлете навсегда выставленной.
что необходимо сделать: при неудачной аутентификации вызывать метод:
clear() {
   login = null;
   ....
}

но опять таки нестоит хранить переменные глобальные в сервлете. см выше.


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
tolet
Дата 6.11.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 24.9.2006
Где: Москва

Репутация: нет
Всего: нет



necromancer, большое спасибо за подробную консультацию. Буду пробовать
PM MAIL WWW ICQ   Вверх
fronya
  Дата 8.11.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.11.2008

Репутация: нет
Всего: нет



Всем привет!! 
Интересная конечно тема использовать Cookies, но я не советую, это не есть хорошо!!! Есть куча проблема с ними....
Если используешь сервлеты, то может лучше использовать интерфейс HTTPSessian, а лучше всего если ты хочешь сам следить за пользователями присваивай им идентификационные номера сам и храни в базе данных с информацией о клиентах (по-моему намного удобней). С Cookies много проблем (- захотел я зайти под другим логином - а сессия таже, зашел по другим браузером - сессия изменилась, короч много всего учитывать надо).


Желаю удачи!!! 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.