Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP] Wielokrotne logowanie
R4D3K
post
Post #1





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


Witam, na początku chce zaznaczyć, że to nie jest problem poruszany n-ty raz, przeszukałem koło 100 tematów na tym forum dotyczących logowania i nie znalazłem odpowiedzi, google milczało, chyba że nie wiem jak zadać pytania dla wujka google, jeśli tak to przepraszam. wstydnis.gif

Posiadam stronę na której jest galeria ze zdjęciami i aby można było je obejrzeć użytkownik musi być zalogowany i mój problem polega na tym iż 1 osoba się rejestruje i podaje reszcie swój login i hasło i jednocześnie oglądają zdjęcia. Z praktyki wiem że w jednym czasie na 1 loginie przegląda zdjęcia nawet 4 użytkowników jednocześnie. Chcę to wyeliminować i zmusić każdego z tych użytkowników to założenia konta.

Na podstronie z galerią sprawdzam, czy osoba jest zalogowana za pomocą sesji:

  1. <?php
  2. if (isset($_SESSION['id'])) {
  3. // pokaz galerię
  4. }
  5. else {
  6. // powiedz userowi że musi się zalogować
  7. }
  8. ?>


próbowałem używać
session_regenerate_id()" title="Zobacz w manualu PHP" target="_manual , także dodałem regułę do pliku htaccess:
Kod
php_value session.use_only_cookies 1
php_value session.use_trans_sid 0

Oczywiście pozwoliło to wyeliminować spryciarzy, którzy przesyłali link już po zalogowaniu, ale dalej mojego problemu to nie rozwiązało.
Myślałem o tym,żeby stworzyć tabelę z id_usera i id_session i sprawdzać co każde wylistowanie zdjęć czy id sesji zgadza się z orginałem.
Jednak czy to pomoże czy tylko obciąży serwer ? Czy może lepiej wysyłać jakieś ciasteczko, czy też sprawdzać odstęp czasu pomiędzy logowaniami
czy w jakiś sposób sprawdzać czy dany użytkownik jest zalogowany ? (jeśli tak to w jaki ?)

Prosiłbym tych, którzy spotkali się z tym problemem, żeby opisali jak sobie z tym poradzili, może ktoś wklei jakiś kawałek kodu
Z góry dzięki
Go to the top of the page
+Quote Post
maly_swd
post
Post #2





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

Ostrzeżenie: (0%)
-----


Podczas logowania zapisz IP na ktorym jest zalogowany dany login:) Jesli login nie zgadza sie z IP to musi sie zalogowac:)


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
R4D3K
post
Post #3





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


@maly_swd to za bardzo problemu nie rozwiąże, bo przeważnie logują się na 1 loginie Ci z tego samego "osiedla" co się wiąże z tym, żę mają takie samego providera -> ten sam adres IP. Wiem to po logach.

Ten post edytował R4D3K 30.06.2009, 14:32:13
Go to the top of the page
+Quote Post
Wicepsik
post
Post #4





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


Może identyfikacja przez MAC ?
1 konto = 1 MAC

Ten post edytował Wicepsik 30.06.2009, 14:53:18


--------------------
Go to the top of the page
+Quote Post
kfc4
post
Post #5





Grupa: Zarejestrowani
Postów: 195
Pomógł: 18
Dołączył: 7.10.2007

Ostrzeżenie: (0%)
-----


Zapisujesz w bazie login i id sesji. Jak ktoś się loguje to sprawdzasz czy taki login już istnieje w tabeli (po np. pół godzinie nie aktywności kasujesz rekord (sprawdzasz pole w którym zapisujesz ostatnią aktywność)), jak tak to porównujesz z id sesji, jeżeli są różne to wywalasz komunikat, że musi mieć własny login, jak się zgadza to przepuszczasz. Aby zapobiec użytkownikom, wyłączającym komputer bez wylogowania i włączającym go za 15 minut możesz w ciasteczkach trzymać coś indywidualnego np. time+nazwa przeglądarki i to porównywać zamias id sesji.

Ja kiedyć porówynywałem ciasteczko z zawartością w bazie, rekord kasowałem po 30 minutach nie aktywności (razem z ciasteczkiem).

Ten post edytował kfc4 30.06.2009, 14:56:14
Go to the top of the page
+Quote Post
MateuszS
post
Post #6





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Zrob przy rejestracji ciasteczko ktore tam ma czas time()+9999999999999999 i potem sprawdzaj przy logowaniu czy to ciacho istnieje jak nie to niech koles spieprza


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
kfc4
post
Post #7





Grupa: Zarejestrowani
Postów: 195
Pomógł: 18
Dołączył: 7.10.2007

Ostrzeżenie: (0%)
-----


Mateusz: nie wypali pomysł bo:
-zmiana komputera;
-przeglądarki;
-format;
-logowanie u kogoś innego;
-wyczyszczenie danych prywatnych
-i jeszcze parę innych
Go to the top of the page
+Quote Post
MateuszS
post
Post #8





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


kfc4,
trzeba by sie nad tym glebiej zastanowic


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
dworakex
post
Post #9





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 30.06.2009

Ostrzeżenie: (10%)
X----


Do tabeli z userami dodajesz pole "sid" gdzie zamieszczasz identyfikator sesji i pole "time" gdzie wstawisz czas w timestamp. Przy logowaniu każdy dostaje sida, którego dodajemy do bazy danych. Jeśli aktualny timestamp będziewiększy od "time"+1800 (czyli jesli przez pol godziny nioe będzie zadnej akcji" to zmieniasz "sid" na 0. Przy logowaniu sprawdzamy czy "sid"==0. Dodajesz też opcję wyloguj, która też ustawia SID na 0.
Go to the top of the page
+Quote Post
R4D3K
post
Post #10





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


@Wicepsik
Jak zrobić porównywanie adresu MAC w PHP ?

@dworakex
Zapisywanie w tabeli id sesji, też na tym myślałem, ale tu pojawia się problem z początku, osoba nie zalogowana uzyska dostęp tam gdzie nie powinna. Wystarczy się zalogować, wyłączyć cookie i przesłać komuś linka z PHPSESSID, także trzeba co każde wyświetlenie strony korzystać z session_regenerate_id(), co wyklucza porównanie z id sesji w bazie.

@MateuszScirka
Cytat
]Zrob przy rejestracji ciasteczko ktore tam ma czas time()+9999999999999999 i potem sprawdzaj przy logowaniu czy to ciacho istnieje jak nie to niech koles spieprza

Właśnie do mnie wchodzą tacy cfaniacy co sobie z tym radzą.

Ten post edytował R4D3K 30.06.2009, 15:28:10
Go to the top of the page
+Quote Post
dworakex
post
Post #11





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 30.06.2009

Ostrzeżenie: (10%)
X----


Dlaczego nei regenerować id? Albo wymusić stosowanie ciasteczek, albo możesz co 10 kliknięć robić "Wpisz haslo:". W każdym razem, mogą hasło sobie popodawać, to wtedy masz znoka, będą naraz wszyscy tongue.gif
Go to the top of the page
+Quote Post
R4D3K
post
Post #12





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


Hmmm no tak regenerować id sesji mogę to co wtedy z zapisywaniem id sesji do bazy za każdym razem to robić ? Trochę chyba nieoptymalne
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Może identyfikacja przez MAC ?
1 konto = 1 MAC

Na głowę upadłeś?

Z tego, co pamiętam, to MAC jest tylko w warstwie łącza danych. tongue.gif


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
R4D3K
post
Post #14





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


Tak PHP jako język po stronie serwera nie ma dostępu do zasobów komputera lokalnego.
@erix może wiesz jak rozwiązać ten problem ?
Go to the top of the page
+Quote Post
pgrzelka
post
Post #15





Grupa: Zarejestrowani
Postów: 313
Pomógł: 24
Dołączył: 9.08.2008
Skąd: Kielce

Ostrzeżenie: (0%)
-----


temat pobierania adresu mac jest poruszony w Archiwum Pro
Temat: MAC_zamiast_IP

z tymi sesjami to też nie najgorszy pomysł, zapisuj login lub ip do sesji a najlepiej obie zmienne i pilnuj aby te wartości się nie powtarzały,
czyli jeśli ktoś o loginie 'maniek' jest zalogowany to przy logowaniu z innego komputera loginem 'maniek' sprawdzasz czy już taka osoba nie jest zalogowana

jeśli bardzo namieszałem to przepraszam winksmiley.jpg

Ten post edytował pgrzelka 30.06.2009, 22:45:31


--------------------
Go to the top of the page
+Quote Post
erix
post
Post #16





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Adres MAC, to kiepski pomysł, gdyż w przypadku proxy/NAT/tunelu nie masz MAC delikwenta. Poza tym, MAC da się zmienić (niektórzy wciąż żyją w błogiej nieświadomości, że się nie da tongue.gif)


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
R4D3K
post
Post #17





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


@pgrzelka dzięki za info, gdyby nie ty dalej był żył w przekonaniu, że się nie da MAC adresu wyciągnąć i tyle, nawet jeśli chodzi o korzystanie w sieci lokalnej.

Może trochę naświetle problem bardziej, stworzyłem sobie stronę gdzie można znaleźć zdjęcia itp w PHP, wykupiłem płatny hosting zamieściłem pliki.
Strona ma "zasięg" jeśli tego słowa można użyć, "miastowy" to znaczy zdjęcia są robione z imprez w moim mieście z tego powodu 90% ruchu na stronie pochodzi z mojego rodzimego miasta. Jeśli chodzi o dostawców usług internetowych, tam gdzie mieszkam liczą się 2 gracze: Neostrada i Vectra(taka sieć kablowa dostarczająca internet razem z kablówką). Podobnie jak Neostrada, Vectra przydziela adresy IP dynamicznie, w obrębie danej dzielnicy, czyli jedno osiedle ma na wyjściu ten sam adres IP (sprawdziłem). Jedno takie osiedle to ładna liczba użytkowników. Dlatego tak się wystrzegałem weryfikacje przez ip.
Jak narazie wymyśliłem, taki oto sposób wykluczenia wielokrotnego logowania w 1 czasie:
Tworzę tabelę z id_user, sid,time i gdy dany user próbuje się zalogować sprawdzam czy w tej tabeli nie ma wpisu z jego ID, jesli jest to sprawdzam, czy jego id sesji jest równe wartości pola sid, jeśli jest to każę mu się zalogować, jeśli nie to go loguje tworząc odpowiedni wpis w bazie danych. Trochę to zawiłe, więc może użyje pseudokodu:
  1. <?php
  2. if (isset($_POST['login'])) {
  3. // user chce się zalogować
  4.  $dane=mysql_fetch_array(mysql_query('SELECT * FROM session WHERE id_user=SELECT id FROM users WHERE login=$_POST['login'] AND pass=md5($_POST['pass']))
  5.    if ($dane['sid]==session_id()) {
  6.    // Mam cię spryciarzu teraz grzecznie załóż konto i się zaloguj
  7.  }
  8.  else {
  9.   // OK zaloguj się i uaktualnij tabelę session
  10.  }
  11. }
  12. ?>


I co myślicie czy ten sposób jest OK ? Bo ja tu widzę problem z łatwością przejęcia takiej id sesji, ponieważ session_regenerate_id()" title="Zobacz w manualu PHP" target="_manual nie będzie wykorzystywane i ciągle muszę uaktualniać wpis w tabeli session. No chyba że się mylę, lub jest jakiś sposób żeby nie przesyłac tylu zapytań.

Ten post edytował R4D3K 30.06.2009, 23:29:22
Go to the top of the page
+Quote Post
erix
post
Post #18





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




  1. skrypt jest dziurawy (SQL Injection)
  2. MD5 też można "odwrócić"
  3. Cytat
    Jak narazie wymyśliłem, taki oto sposób wykluczenia wielokrotnego logowania w 1 czasie:
    • ukryte ciastko z długim czasem ważności
    • sprawdzanie User-Agent
Tyle mi na razie przyszło do głowy


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
R4D3K
post
Post #19





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


dzięki erix, to że jest dziurawy to wiem już nie dodawałem tutaj zabepieczeń
Go to the top of the page
+Quote Post
MolTAR
post
Post #20





Grupa: Zarejestrowani
Postów: 17
Pomógł: 2
Dołączył: 15.08.2007
Skąd: Nowy Targ

Ostrzeżenie: (0%)
-----


A nie można by do tabeli z użytkownikami dodać pola 'zalogowany'. Jeśli zaloguje się to zalogowany = 1 jeśli wyloguje to zalogowany = 0, po przekroczeniu czasu sesji tak jak wcześniej pisaliście tam zalogowany znów = 0. I sprawdzać przy logowaniu czy przy tym userze jest 'zalogowany' = 1 czy 0 jeśli 1 to wywalić komunikat: "jesteś już zalogowany".
Jeden login = jeden komputer.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 15:39