Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]System logowania
sebap123
post
Post #1





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

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


Witam
Napisałem skrytp logowania do strony wykorzystujący sesje. Jest on wykorzystywany na stronie, gdzie chcę, aby w każdej chwili urzytkownik mógł wejść do swojego panelu i zmienić w nim dane lub coś napisać na innej stronie z dokonaniem podpisu.
No i tutaj własie nie wiem czego urzyć. Mysłałem o dwóch wyjściach, a raczej opcjach bo żadna w 100% nie spełnia wymogów:

  1. Urzycie systemu sesji i w adresie strony przesylanie zapisanego w bazie unikatowego numeru, jednak jest to troche nieestetyczne (zaśmieca adres strony) i urzytkownik nie może sam wprowadzić adresu do jakiejść strony (np. z linku ogolnego) bo musi mieć swój nr.
  2. Urzycie cookie, tylko tutaj nie wiem do końca jak tą daną przesyłać miedzy stronami (np. znowu ten numer) jak to sprawdzać, który numer ma urzytkownik i co zrobić jak urzytkownik nie obsługuje cookie (czyli powrót do puntku wyrzej)


Wiem, że może troche zagmatwałem, ale proszę o pomoc bo nie wiem co zrobić.

Mysłalem też o takim pasku na ktorym będzie na każdej stronie widniał login tylko mam srednio pomysł jak tam przesyłac dane między stronami.
Chodzi o taki pasek jak jest nawet na tym forum.
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
Solimo
post
Post #2





Grupa: Zarejestrowani
Postów: 39
Pomógł: 2
Dołączył: 11.08.2007

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


Sesja przekazuje w url, czyli adresie SID czyli session id lub można tez zapisać go do cookie które zostaje wysłane do użytkownika. Polecam ten drugi sposób. Aby zmienić to "ustawienie" możesz np. edytować php.ini. Jednak SID w cookie może być jakoś ukradziony. Warto wtedy zapamiętać np. w bazie danych dane z tablicy SERVER np. user agent i host. I sprawdzać czy są one takie same. Można również użyć session_regenerate_id() co zmniejszy szansę na kradzież sesji - poczytaj w manualu. W sesji trzymaj np user_id z bazy i sprawdzaj czy ktoś jest zalogowany bo ma id usera czy też nie.

Co do drugiego pytania to potnij www na header.php body.php footer.php a następnie za pomocną require/include (znowu manual) pobieraj je w odpowiedniej kolejności. Body zrób generowane dynamicznie, np. jeżeli brak sesji to strona logowania jeżeli sesja jest to cos innego. I teraz w header możesz dać taki pasek i on będzie w każdej stronie bo tylko body się zmienia - oczywiscie sprawdzaj czy pasek powinien być wyświetlony czyli czy w sesji sa odpowiednie dane o user id. To takie najbanalniejsze rozwiązanie.

Ten post edytował Solimo 19.09.2009, 08:04:11
Go to the top of the page
+Quote Post
sebap123
post
Post #3





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

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


A który z tych dwóch systemów (sesje czy cookie) jest bezpieczniejszy. Bo jak tak sobie pocztalem to jednak łatwiej będzie operowac ciasteczkami bo jest to nieco prostsze, a sesje wymagają według mnie więcej zabawy. Pozatym wiele dużych serwisów korzysta z ciateczek tylko.
No ale jak z bezpieczeństwem bo to też ważne.
Go to the top of the page
+Quote Post
fander
post
Post #4





Grupa: Zarejestrowani
Postów: 231
Pomógł: 22
Dołączył: 6.10.2008

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


używa się tylko sesji, ciasteczko służy do przekazywania identyfikatora sesji.

Ten post edytował fander 23.09.2009, 15:05:47
Go to the top of the page
+Quote Post
Berg
post
Post #5





Grupa: Zarejestrowani
Postów: 180
Pomógł: 37
Dołączył: 1.05.2008
Skąd: Białystok

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


Ogólnie żadna z tych metod nie jest bezpieczna jeśli sesji dodatkowo nie zabezpieczysz (np. zabezpieczenie strony przed xss, dodatkowy klucz autoryzacyjny w bazie danych, skrócony czas trwania sesji odświeżany po jakiejkolwiek aktywności użytkownika). Ogólnie sesje przekazywane przez url są w moim odczuciu mniej bezpieczne (ostatecznie wystarczy użyszkodnik z snifferem w sieci i SID już jest znany). Dodatkowo przy przekazywaniu sesji przez url nie będziecie się lubić z Google winksmiley.jpg
Go to the top of the page
+Quote Post
sebap123
post
Post #6





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

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


Cytat
używa się tylko sesji, ciasteczko służy do przekazywania identyfikatora sesji.

To mi bardzo pomogło. Jednak teraz mam innego typu pytanie.
Rozumiem, że sejsa (a raczej jej identyfikator) przesyłany jest w ciasteczku. W sesji zalózmy jest login i jakaś dodatkowa informacja o użytkowniku. Strona sprawdza za każdym razem czy taki identyfikator został umieszczony i go "uruchamia".
Tylko teraz pytanie, skąd skrypt ma wiedzieć jaka sesja komu odpowiada bo tego jakoś jeszcze nie widze (czyli jak w cisteczku umieścić żeby zapisana była dana sesja i żeby potem skrypt sprawdzil co ma zrobić z tą sesją).
Go to the top of the page
+Quote Post
Berg
post
Post #7





Grupa: Zarejestrowani
Postów: 180
Pomógł: 37
Dołączył: 1.05.2008
Skąd: Białystok

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


session-start, polecam przeczytanie całego działu w manualu dotyczącego sesji.
Go to the top of the page
+Quote Post
sebap123
post
Post #8





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

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


Przeglądam manuala, ale wydaje mi się, że wystarczy użyć session id (oczywiście oprocz session start). Jednak caly czas średnio rozumiem jedną rzecz.
Użytkownik loguje się do systemu, session id się tworzy. Potem wchodzi na jakąś inną stronę tego portalu jako zalogowany. Normalnie bez SID używałem GET i zmienna w adresie. Bo w tej zmiennej był np. login czy numer użytkownika, przy pomocy którego byla sprawdzana i pobierana z bazy danych reszta danych (taka jak uprawnienia). Teraz jednak nie wiem jak to zrobić bo wypiszę czy podepnę SID do zmiennej i jak sprawdzić co ta sesja zawiera, czyli jak z niej pobrać umieszczony np. login.
Go to the top of the page
+Quote Post
Berg
post
Post #9





Grupa: Zarejestrowani
Postów: 180
Pomógł: 37
Dołączył: 1.05.2008
Skąd: Białystok

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


Ale jaki masz dokładnie problem? Sprawdzasz czy sesja istnieje, czy ustawione są poprawne dane, jeśli nie to przekierowujesz użytkownika na stronę logowania i dopisujesz odpowiednie dane.

Dane do sesji zapisujesz za pomocą
  1. $_SESSION['zmienna'] = 'dane';
potem odczytujesz wywołując
  1. $_SESSION['zmienna']
Jeśli sesja się przedawniła (np. czas życia ciasteczka się skończył, użytkownik się wylogował) to $_SESSION['zmienna'] nie będzie istniała, np.
  1. if(isset($_SESSION['login'])) {
  2. echo 'sesja istnieje, użytkownik jest zalogowany';
  3. }
  4. else {
  5. // Przekierowuje użytkownika do logowania gdzie po poprawnej autoryzacji zostanie ustawiona zmienna $_SESSION['login']
  6. }
Go to the top of the page
+Quote Post
sebap123
post
Post #10





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

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


No dzięki za radę sprawdzę to i dam znać.

Dobra cos tam popisałem i wyszedl mi kod:
  1. if (isset ($_POST['submit']))
  2. {
  3. $login = $_POST['login'];
  4. $query = mysql_query("SELECT * FROM Uzytkownicy WHERE login = '$login' ");
  5. $fetch = mysql_fetch_array($query);
  6. $getlist="Select * from Uzytkownicy order by id ASC";
  7. $getlist2=mysql_query($getlist) or die ("Could not get list");
  8. $getlist3=mysql_fetch_array($getlist2);
  9. $usr = $getlist3['au_code'];
  10. $id = $getlist3['id'];
  11. $koniec = 'usr='.$usr;
  12. $link = 'admin.php?'.$koniec;
  13. if ( $fetch ) // jesli user zostanie znaleziony w bazie
  14. {
  15. if ( md5( $_POST['password'] ) == $fetch['haslo'] ) // jesli haslo sie zgadza
  16. {
  17. if ($fetch['status'] == 0)
  18. {
  19. print "Twoje konto nie jest aktywne";
  20. }
  21. if ($fetch['status'] == 1)
  22. {
  23. $_SESSION['login'] = "$usr";
  24. print 'logowanie normalne zakonczone sukcesem<br>';
  25. print 'Zalogowany';
  26. print '<a href="sender.php">Klik</a>';
  27. }
  28. if ($fetch['status'] != 0 && $fetch ['status'] != 1)
  29. {
  30. $_SESSION['login'] = "$usr";
  31. print 'logowanie specjalne zakonczone sukcesem<br>';
  32. print "Zalogowany<br>";
  33. print '<a href="admin.php">link</a><br>';
  34. }
  35. }
  36. else
  37. {
  38. print 'Przykro mi, ale podane haslo jest bledne';
  39. }
  40. }
  41. else
  42. {
  43. print 'Podany uzytkownik nie istnieje w bazie danych';
  44. }
  45. }
  46. else
  47. {
  48. print "Blad";
  49. }
  50. ?>


A na stronie na która jest broniona hasłem jest taki kod:

Kod który sprawdza:
  1. if (isset ($_SESSION['login']))
  2. {
  3. $id = htmlspecialchars ($usr);
  4. $query = mysql_query("SELECT * FROM Uzytkownicy WHERE id = '$id' ");
  5. $fetch = mysql_fetch_array($query);
  6. $getlist="Select * from Uzytkownicy order by id ASC";
  7. $getlist2=mysql_query($getlist) or die ("Could not get list");
  8. $getlist3=mysql_fetch_array($getlist2);
  9. if ( $fetch )
  10. {
  11. $imie = $getlist3['imie'];
  12. $status = $getlist3['status'];
  13. }
  14. else
  15. {
  16. print "nie znaleziono usera";
  17. }}

Wlasciwa strona:
  1. <?php
  2. include "includes/base.php";
  3. if ($status != 1 && $status !=0)
  4. {
  5. ?>
  6. //dalej kod HTML


No i jak się loguje jako admin (czyli spełniam wszystkie wymagane warunki) to jak by nie łapie sesji i odrazu mnie wurzuca na strone błędu. Dokładniej rzecz biorąc wyświetla się hasło "logowanie specjalne zakończone sukcesem" ale potem jak używam linku do panelu admina to nie widzi już, że jestem zalogowany.

Bardzo prosze o pomoc
Go to the top of the page
+Quote Post
Berg
post
Post #11





Grupa: Zarejestrowani
Postów: 180
Pomógł: 37
Dołączył: 1.05.2008
Skąd: Białystok

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


A o session_start przed ustawieniem zmiennej sesyjnej i przed jej odczytaniem przez przypadek nie zapomniałeś?
Go to the top of the page
+Quote Post
sebap123
post
Post #12





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

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


To tam gdzie uważałem, że powinno byc session_start to dodalem teraz:
  1. if ( $fetch ) // jesli user zostanie znaleziony w bazie
  2. {
  3. if ( md5( $_POST['password'] ) == $fetch['haslo'] ) // jesli haslo sie zgadza
  4. {
  5. if ($fetch['status'] == 0)
  6. {
  7. print "Twoje konto nie jest aktywne";
  8. }
  9. if ($fetch['status'] == 1)
  10. {
  11. $_SESSION['login'] = "$usr";
  12. print 'logowanie normalne zakonczone sukcesem<br>';
  13. print 'Zalogowany';
  14. print '<a href="sender.php">Klik</a>';
  15. }
  16. if ($fetch['status'] != 0 && $fetch ['status'] != 1)
  17. {
  18. $_SESSION['login'] = "$usr";
  19. print 'logowanie specjalne zakonczone sukcesem<br>';
  20. print "Zalogowany<br>";
  21. print '<a href="admin.php">link</a><br>';
  22. }
  23. }
  24. else
  25. {
  26. print 'Przykro mi, ale podane haslo jest bledne';
  27. }

  1. <?
  2. require_once "includes/connect.php";
  3. if (isset ($_SESSION['login']))
  4. {
  5. $id = htmlspecialchars ($usr);
  6. $query = mysql_query("SELECT * FROM Uzytkownicy WHERE id = '$id' ");
  7. $fetch = mysql_fetch_array($query);
  8. $getlist="Select * from Uzytkownicy order by id ASC";
  9. $getlist2=mysql_query($getlist) or die ("Could not get list");
  10. $getlist3=mysql_fetch_array($getlist2);
  11. if ( $fetch )
  12. {
  13. $imie = $getlist3['imie'];
  14. $status = $getlis


Jednak cały czas nie działa:(
Go to the top of the page
+Quote Post
Berg
post
Post #13





Grupa: Zarejestrowani
Postów: 180
Pomógł: 37
Dołączył: 1.05.2008
Skąd: Białystok

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


Jedno session_start na początku każdego pliku przed wysłaniem jakiegokolwiek html'a....
Go to the top of the page
+Quote Post
sebap123
post
Post #14





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

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


No i nadal nic.
Umieściłem session_start na początku każdej ze stron (oprócz strony, która łączy się z bazą i tej na ktorej jest panel logowania) i nic nie chce działać. Caly czas jest tak jak by tracił w jakims momencie sesję i dane o użytkowniku ale nie mam zupełnie pojecia kiedy.
Go to the top of the page
+Quote Post
Berg
post
Post #15





Grupa: Zarejestrowani
Postów: 180
Pomógł: 37
Dołączył: 1.05.2008
Skąd: Białystok

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


Odpal raportowanie wszystkich błędów bo z tego co widzę to masz je wyłączone. Pamiętaj że przy logowaniu też musi być odpalona sesja.
Go to the top of the page
+Quote Post
sebap123
post
Post #16





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

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


Dobra już wszędzie uruchamiam sesje i nadal nic.

A co do tego raportowania błędów to musisz mi powiedzieć jak to zrobic bo nigdy tego nie używałem i nie weim jak to zrobić.
Go to the top of the page
+Quote Post
Berg
post
Post #17





Grupa: Zarejestrowani
Postów: 180
Pomógł: 37
Dołączył: 1.05.2008
Skąd: Białystok

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


Błagam, trochę własnej inwencji...
Raportowanie błędów
Ustaw najlepiej E_ALL i podrzuć co Ci tam php wypluwa.
Go to the top of the page
+Quote Post
!*!
post
Post #18





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Poza tym, co to jest:

Kod
if ( $fetch )
{


Przy logowaniu sprawdź czy login i hasło się zgadza, jeśli tak, ustaw sesję np. $_SESSION['logowanieok'] na 1. A później w każdym pliku sprawdzaj czy takowa sesja istnieje, do tego ustaw czas trwania sesji na np. 20 minut

Kod
if(($_SESSION['czaslogowania']+$mozliwyczaslogowania)<time


Dodatkowo możesz do sesji dopisać IP, useragenta czy jakieś losowe liczby.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
sebap123
post
Post #19





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

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


Kod
Notice: A session had already been started - ignoring session_start() in /home/.../public_html/pk/includes/base.php on line 4

Notice: Undefined variable: usr in /home/.../public_html/pk/includes/base.php on line 8

Notice: Undefined variable: status in /home/.../public_html/pk/admin.php on line 6

Notice: Undefined variable: status in /home/.../public_html/pk/admin.php on line 6


No teraz mniej więcej wiem o co chodzi.
Rzeczywiście jest bląd z pobraniem zmiennej status która sprawdza czy użytkownik jest zalogowany dlatego przenosi na strone błędu logowania.
Czyli ogólnie nie chce pobrac żadnej zmiennej z sesji.

Oto fragmenty kodu:
admin:
  1. include "includes/base.php";
  2. if ($status != 1 && $status !=0)
  3. {

base.php:
  1. require_once "includes/connect.php";
  2. if (isset ($_SESSION['login']))
  3. {
  4. $id = htmlspecialchars ($usr);


Możecie mi teraz coś podpowiedzieć bo cały czas chyba chodzi o to samo czyt. przekazywanie danych.
Go to the top of the page
+Quote Post
!*!
post
Post #20





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Dlaczego chcesz sprawdzać czy zmienna $status ma wartość inną niż 1 i jednocześnie inną niż 0? Nie sprawdzaj czy sesja istnieje poprzez isset, tylko sprawdź czy odpowiednia jest zawartość jaką jej nadałeś.

Ten post edytował !*! 26.09.2009, 21:26:06


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
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: 19.08.2025 - 13:46