[Delphi] Jak zabronic powtornego logowania

0

Witam
Umiescilem ten post z racji pewnie prostosty rozwiazania na Newbie , lecz nikt nie udzielil mi podpowiedzi - wiec niesmialo umieszczam ten post tutaj :))

Mam pytanie. Mam napisany program korzystajacy z MySql . Uzywam komponentow Zeos.
Jak mozna zabronic powtornego logowania? Tz. Jesli jeden uzytkownik jest zalogowany to inny aby nie wszedl na jego user i pass? Trzeba to zrobic na serwerze? Czy mozna to sprawdzic programowo?
Dziekuje za ewentualne sugestie i ostre riposty:)

Pozdrawiam

0

Nie w 100% rozumiem, na jakiej zasadzie to logowanie ma działać, ale tak generalnie możesz to sprawdzić od strony swojego programu. Od strony serwera chyba ciężko by było (w sensie, żeby w serwerze MySQL zablokować taką możliwość). Pytanie tylko, czy rzeczywiście chcesz tak zrobić. Mam wrażenie, że w takiej sytuacji jak program zostanie przerwany bez poprawnego wylogowania, to stracisz możliwość zalogowania się w ogóle na takiego użytkownika. Ponadto jak ktoś przejmie Twoje hasło i się zaloguje na Ciebie, to wtedy Ty nie będziesz miał możliwości zalogowania dopóki taka osoba sięgrzecznie nie zaloguje. W większości przypadków, w których są takie zabezpieczenia są robione raczej na odwrót: logując się zamykasz sesję innego użytkownika, który był zalogowany wcześniej.

0

Wiec tak chodzi mi o to iz:
Z jednego PC loguje sie uzytkownik 'michal' na haslo przypisane do michala i dodaje dane do bazy.
Z drugiego PC loguje sie uzytkownik 'michal' na haslo przypisane do michala i tez zaczyna pracowac- i wlasnie to drugie zalogowanie chce wyelimowac.

moze trzeba zapisac uzytkownika przy logowaniu do jakiejs zalozmy tablicy po zalogowaniu ustawic mu jakis : true lub 1 , i przy nastepnym zalogowaniu to sprawdzac ??
Ma to sens?

Pozdrawiam

0

To może inaczej: Do czego on się loguje? Do serwera MySQL, czy do serwera będącego Twoim programem, wykorzystującego MySQL? Bo to całkowicie zmienia postać rzeczy.

0

Loguje sie do sie do serwera MySql . Juz widze iz moj pomysl jest do d..py.
Chyba ze kazdy bedzie mial skrot do programu ktory jest na serwerze ( program laczy sie z serwerem - localhost.
Pozdrawiam

0
boryna napisał(a)

Wiec tak chodzi mi o to iz:
Z jednego PC loguje sie uzytkownik 'michal' na haslo przypisane do michala i dodaje dane do bazy.
Z drugiego PC loguje sie uzytkownik 'michal' na haslo przypisane do michala i tez zaczyna pracowac- i wlasnie to drugie zalogowanie chce wyelimowac.

moze trzeba zapisac uzytkownika przy logowaniu do jakiejs zalozmy tablicy po zalogowaniu ustawic mu jakis : true lub 1 , i przy nastepnym zalogowaniu to sprawdzac ??
Ma to sens?

Pozdrawiam

Ja bym to rozwiązał tak: Loguje się Np. Jcek i w tym momecie wysyła na serwer jakis plik tekstowy z a w nim nr np. 1. Jak ktoś kolejny prubuje sie zalogowac to najpierw program pobiera plik tekstowy i sprawdza nr. jeśli jest 1. to skrpt nie pozwala na logowanie. Jak Jacek kończy prace to w on close formy piszesz skrypcik ktoy nadpisze plik tekstowy na serwerze kopiując plik pusty.

0

To ma dwie poważne wady:

  1. Ktoś używając nie Twojego programu może się dalej połączyć.
  2. Jak Ci padnie program i nie zapisze, że się wylogowałeś, to bez administratora serwera nic nie zdziałasz.
    Innymi słowy w ogóle rozwiązywanie kwestii zabezpieczania serwera po stronie klienta mija się z celem :P
0
Adam.Pilorz napisał(a)

To ma dwie poważne wady:

  1. Ktoś używając nie Twojego programu może się dalej połączyć.
  2. Jak Ci padnie program i nie zapisze, że się wylogowałeś, to bez administratora serwera nic nie zdziałasz.
    Innymi słowy w ogóle rozwiązywanie kwestii zabezpieczania serwera po stronie klienta mija się z celem :P

ad1: W jaki sposób? No chyba, że mu administrator serwera poda potrzebne dane.
ad2: Program sam z siebie nie może paść, ale zgadzam się, że może wystąpić jakaś nieprzewidziana awaria np. kompa. Wówczas telefon i Dzowinisz do administratora serwera.

0

Witam

Dziekuje za rady . Postaram sie cos z tego stworzyc . O swoich ewentualnyych sukcesach i porazkach - napisze.

Pozdrawiam

0

A nie prościej (jeśli dobrze zrozumiałem) zrobić tabelę w bazie MySQL np SESSIONS
z polami USER, TIME, SESSION_NR.

Jak user by się logował i to:

  1. sprawdzasz czy istnieje wpis z USEREM, jeśli obecny czas różni się od zapisanego od więcej niż MAX_TIME to logujesz, inaczej CLOSE
  2. generujesz losowy identyfikator i zapisujesz do bazy - podając usera, czas obecny(generowany w zapytaniu MySQL'a, aby nie zmieniać dat) i wygenerowany identyfikator.
    Przy każdej akcji zwiększasz do obecnego czas jeśli ID = zapisanemu w programie, inaczej wylogowanie.

;P

//Przepraszam nie zauwazyłem że już to ktoś napisał :/

0
Adam.Pilorz napisał(a)

ad1: W jaki sposób? No chyba, że mu administrator serwera poda potrzebne dane.

No chyba wystarczy tylko crackować program tak aby nie sprawdzał tego pliku.

0
Adam.Pilorz napisał(a)

To ma dwie poważne wady:

  1. Ktoś używając nie Twojego programu może się dalej połączyć.
  2. Jak Ci padnie program i nie zapisze, że się wylogowałeś, to bez administratora serwera nic nie zdziałasz.
    Innymi słowy w ogóle rozwiązywanie kwestii zabezpieczania serwera po stronie klienta mija się z celem :P

ad 2) A kto Ci kaze logowac USERA? Wystaczy zapisac IP (lub przy DHCP - MAC adres). Ma to te zalete, ze gdy program wykryje ponowne logowanie z tego samego adresu gdy nie zostala wykonana procedura wylogowania - wie, ze wystapila sytuacja anormalna i moze podjac odpowiednie kroki.

ad 1) Czy nikt tu juz nie czyta dokumentacji? Stoi jak wol (MySQL 5.x, dokumentacja, 13.5.1.3., GRANT and REVOKE Syntax):
"with_option =
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
"
"The MAX_USER_CONNECTIONS count option, implemented in MySQL 5.0.3, limits the maximum number of simultaneous connections that the account can make. If count is 0 (the default), the max_user_connections system variable determines the number of simultaneous connections for the account. "

Pozdrawiam

0

Dobra Shreq, zdajesz sobie sprawę na jakim procencie serwerów stoi MySQL 5? Bo na zdecydowanej większości jest jeszcze 4, więc myślę że to tutaj by trzeba było szukać rozwiązania.

Wracając do moich poprzednich argumentów.
Ad.1: Nikt nie musi podawać żadnych danych. Jeśli masz program, który się łączy z bazą i identyfikuje Ciebie po nazwie użytkownika i haśle, to raczej tą nazwę użytkownika i hasło znasz i je podajesz. Nawet jeśli nie, to posiadając ten program nie ma większej trudności w wydobyciu takich danych.
Ad.2: Jak chodzi o to, dlaczego loguję usera to dlatego, że o to było pytanie. Jak chodzi o padnięcie programu - z całym szacunkiem, ale piszemy oprogramowanie pod Windowsy na domowe komputery, a nie pod stabilny system do serwerowni jakiejś, gdzie każdy komputer ma kilka zewnętrznych źródeł zasilania + jakieś własne wewnętrzne (akumulatory, generatory). Wystarczy, że Ci się system powiesi, albo nawet sam program przestanie z jakiegoś powodu odpowiadać i będziesz musiał go ubić, albo że będzie przepięcie w sieci, albo co jeszcze innego - i już leżysz. Nie wspominając o nieprzewidzianym wyłączeniu listwy czy przypadkowym wciśnięciu resetu, co się ZDARZA.

0
Adam.Pilorz napisał(a)

Dobra Shreq, zdajesz sobie sprawę na jakim procencie serwerów stoi MySQL 5? Bo na zdecydowanej większości jest jeszcze 4, więc myślę że to tutaj by trzeba było szukać rozwiązania.

Wracając do moich poprzednich argumentów.
Ad.1: Nikt nie musi podawać żadnych danych. Jeśli masz program, który się łączy z bazą i identyfikuje Ciebie po nazwie użytkownika i haśle, to raczej tą nazwę użytkownika i hasło znasz i je podajesz. Nawet jeśli nie, to posiadając ten program nie ma większej trudności w wydobyciu takich danych.
Ad.2: Jak chodzi o to, dlaczego loguję usera to dlatego, że o to było pytanie. Jak chodzi o padnięcie programu - z całym szacunkiem, ale piszemy oprogramowanie pod Windowsy na domowe komputery, a nie pod stabilny system do serwerowni jakiejś, gdzie każdy komputer ma kilka zewnętrznych źródeł zasilania + jakieś własne wewnętrzne (akumulatory, generatory). Wystarczy, że Ci się system powiesi, albo nawet sam program przestanie z jakiegoś powodu odpowiadać i będziesz musiał go ubić, albo że będzie przepięcie w sieci, albo co jeszcze innego - i już leżysz. Nie wspominając o nieprzewidzianym wyłączeniu listwy czy przypadkowym wciśnięciu resetu, co się ZDARZA.

Podtrzymuje WSZYSTKO co napisalem :)

Nie chcialem zasmiecac forum przytaczaniem pelnej dokumentacji, ale widze ze bylo trzeba. Opcja ograniczania ilosci polaczen DLA KONKRETNEGO UZYTKOWNIKA zostala wprowadzona w wersji 5.x. Oto fragment dokumentacji z wersji 4.1.7:
"max_user_connections
The maximum number of simultaneous connections allowed to any given MySQL account. A value of 0 means ``no limit.'' This variable was added in MySQL 3.23.34."

Dalej polecam czytanie dokumentacji :P

Z pytania nie wynika wprost, ze serwer musi byc "obcy". Ja to zrozumialem nastepujaco: "CZY MOZNA ograniczyc ilosc polaczen dla jednego uzytkownika". Odpowiedz: MOZNA. Proste :)

Nie kwestionuje padow komputera, resetow etc. Borykam sie z bazami danch od 16 lat. Podalem proste , skuteczne i SPRAWDZONE rozwiazanie: skoro piszesz program, decydujesz tez, co jest zapisywane w bazie. Zapisywanie samego loginu jest wiazaniem sobie nog, jak napisalem. Jesli zapiszesz rowniez MAC-a - masz korzysc podwojna:
a) wykrywasz logowanie uzytkownika z innego MAC-a, a masz jak wol ze jeszcze jest zalogowany z innego - obslugujesz przypadek logowania sie z kilku komputerow na to samo haslo.
b) logowanie z tego samego MAC-a, a poprzednia sesja otwarta - wystapila awaria lub uruchomienie dwoch kopii programu na tym samym komputerze.
Jest oczywiscie przypadek, ze userowi komputer padl wiec poszedl do innego i probuje sie zalogowac - to tez daje sie obsluzyc, ale jak - wpadnij na to sam :)

Pozdrawiam

0

Postanowilem skorzystac z rady kolegi Shreq'a - poczytalem w manualu i chcialbym ustawic w tabeli user:
Niestety w tabeli user nie ma kolumnu max_user_connections - przczytalem dalej w manualu ze jezeli nie ma takiej kolumny to nalezy uruchomic: mysql_fix_privilege_tables.sql tak tez uczynilem - jakiez bylo moje zdziwienie kiedy dalej nie zostala dodana kolumna max_user_connections.
I tu moje pytanie dodalem recznie taka kolumne :
alter table user max_user_connections int(11) unsigned not null ;
dalem pozniej
flush privileges lecz kiedy dodaje uzytkownika:

mysql> GRANT ALL ON customer.* lukasz
-> IDENTIFIED BY 'lukasz'
-> WITH MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 1;

to max_connections_per_hour 5 przechodzi bez problemu a max_user_connections 1 juz nie :((

Probowalem samo max_connections_per_hour i pieknie chodzi :)

Ktos wie gdzie robie blad? Czy dobrze zrobilem dodajac kolumne recznie?

Pozdrawiam

0

zapomnialem dodac ze wersja MySql to: 4.1.13a

0
boryna napisał(a)

Postanowilem skorzystac z rady kolegi Shreq'a - poczytalem w manualu i chcialbym ustawic w tabeli user:
Niestety w tabeli user nie ma kolumnu max_user_connections - przczytalem dalej w manualu ze jezeli nie ma takiej kolumny to nalezy uruchomic: mysql_fix_privilege_tables.sql tak tez uczynilem - jakiez bylo moje zdziwienie kiedy dalej nie zostala dodana kolumna max_user_connections.
I tu moje pytanie dodalem recznie taka kolumne :
alter table user max_user_connections int(11) unsigned not null ;
dalem pozniej
flush privileges lecz kiedy dodaje uzytkownika:

mysql> GRANT ALL ON customer.* lukasz
-> IDENTIFIED BY 'lukasz'
-> WITH MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 1;

to max_connections_per_hour 5 przechodzi bez problemu a max_user_connections 1 juz nie :((

Probowalem samo max_connections_per_hour i pieknie chodzi :)

Ktos wie gdzie robie blad? Czy dobrze zrobilem dodajac kolumne recznie?

Pozdrawiam

Metoda dobra, ale od wersj 5.x.
W wersji 3.x wprowadzono mozliwosc ograniczenia wszystkim uzytkownikom ilosci jednoczesnych polaczen, wprowadzajac zmienna globalna max_user_connections. Ustawia sie ja komenda
mysql> SET GLOBAL max_user_connections=n;
(oczywiscie mysql> to zgloszenie programu mysql)
Od wersj 4.x rozszerzono te mozliwosci, ale mozliwosc indywidualnego ograniczania polaczen pojedynczemu uzytkownikowi wprowadzono dopiero w wersji 5.x
Masz do wyboru:
a) Zostac przy wersji 4.x i stosowac SET GLOBAL dla wszystkich uzytkownikow
b) zrobic upgrade/instal wersji 5.x i tam zastosowac patent ktorego probowales.

Pozdrawiam

0

Ok dziekuje wszystkim za porady.
Przeszedlem na MySql 5 i wszystko smiga jak nalezy.

Pozdrawiam
Łukasz

1 użytkowników online, w tym zalogowanych: 0, gości: 1