Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Bezpieczne logowanie
Forum PHP.pl > Forum > PHP
kiler129
Siedzę już od rana i prubuję wymyślec dobre logowanie ale ni w ząb nie mogę nic wymyslić. Co prawda zrobiłem taki system ale opiera się o na sprawdzaniu czy w POST są dane ale jak user wejdzie w inny katalog (tworzę internetowy dysk) to te dane z post znikają i zostaje wywalony dry.gif
Pomyślałem aby zrobic tak ze jak się zaloguje i hasło i login będą się zgadać to ustawia ciacho z zawartościa zalogowany i tyle ale sęk w tym że jeśli ktoś zaloguje się na swój internetowy dysk z loginem np. zosia i zostanie przeniesiony do strony strona.pl/zosia i tam ma swój skrypt to gdy teraz wpisze sobie w pasku adresu strona.pl/marysia to skrypt sprawdzi że ok, jest w ciachu zalogowany wiec dopuści.
Czy ktoś może mi podsunąć pomysł jak to zrobić ?
Więc tak, pomyślałem że zrobię z tym ciachem ale w ciachu będzie pisać jeszcze katalog - dobre rozwiązanie ?
Kicok
Poczytaj o sesjach w PHP. Możesz w nich zapisać czy użytkownik jest zalogowany czy nie oraz nazwę katalogu do jakiego ma mieć dostęp.
misiek172
ciacha nie są dobre bo są client-side natomiast sesje są server-side i teoretycznie nie ma do nich dostępu potenjalny użytkownik, więc popieram Kicok'a jężeli chodzi o zastosowanie sesji a są one dość proste: (każda osoba ma swój unikatowy numer sesji, który dostępy jest pod poleceniem session_id();
  1. <?php
  2. $_SESSION['zalogowany'] = 1; //jeśli zalogowany lub 0 jeśli nie
  3. $_SESSION['nick'] = 'nick użytkownika';
  4. ?>

a wyświetlasz je tylko echo $_SESSION['zalogowany'] itd smile.gif
kiler129
Poczytałem troszkę o sesjach i jakos nie rozumiem zabardzo o co w tym chodzi tongue.gif

Więc mam sobie folder X a w nim foldery kasia, zosia, marysia. No i w kazdym znich skrypt który pozwala zarządzać tym katalogiem. Problem jest taki że nie wiem jak zrobić to logowanie. Bo przeiciez user kasia nie może miec dostepu do folderu zosia itd.

Czy w sesjach moge sobie przekazywac dowolną ilośc danych ?
PiratNowegoPokolenia
ile chcesz ... choć za duża ilość danych nie jest wskazana

Nie mam co robić więc ci to jakoś wyjaśnie ...
- Masz tablicę superglobalną $_SESSION ... Jak się zapisuje dane w tablicy to powinieneś wiedzieć ...
- Dane z post sprawdzasz tylko raz przy logowaniu... zapisujesz sobie czy użytkownik to zosia czy kasia...
- przy dostępie do katalogów sprawdzasz czy wartość zapisana w sessji ma określoną wartość
kiler129
Te sesje są *** już meni zaczynają wkurzać. Sesja po zalogowaniu ok, jest ale jak wpisze w pasku adresu adres gdzie pobierane sa dane z sesji to tej sesji nie ma !
Poza tym zastanawiam się skąd serwer wie o którą sesję chodzi ?!

edit: Sesje moje kochane przepraszm was, zapomniałem was wystrtować tongue.gif

Teraz mam problem jak zrobic wylogowanie ? Tzn. jak tą sesję zniszczyć ?

ecit: oświadczam oficialnie że sesje sa huja warte !
Namęczyłęm się przystowałem wszytko do sesji i co widze ? Zalgowałem się jako kasia i owszem w kasi buszuje, teraz wpisałem bez logowania się się katalog basia i co ? No nie wyświetlił sie, odświerzyłem stronę i się pokazał bez logowania exclamation.gif! i w sesji się login zmienił - co jest do cholery ?!
PiratNowegoPokolenia
Dobra dobra smile.gif zaraz ci wszystko wyjaśnie ...
Cytat
Poza tym zastanawiam się skąd serwer wie o którą sesję chodzi ?!

session_id(); ... pokazuje ci id sesji. Takie samo id jest zapamiętywane w cookies przeglądarki ( może być także przekazane metodą GET ) i jest rzeczą świętą :!: jeżeli ci 'ukradną' id podczas gdy sesja jeszcze nie wygasła to może być równe z utratą serwisu...
Cytat
Teraz mam problem jak zrobic wylogowanie ? Tzn. jak tą sesję zniszczyć ?

session_destroy(); smile.gif nie wiem czy słyszałeś o tej funkcji ale na pewno stwierdzenie 'zniszczyć' tu pasuje tongue.gif
Cytat
ecit: oświadczam oficialnie że sesje sa huja warte !

Tego może nie będe komentował ... powiem tylko tyle że bez sesji nie ma życia ...

Co do startu sesji to musi być to na każdej stronie ... ale to chyba oczywiste

a to że ci nie wychodzi :?: to już na sesje nie zwalaj
kiler129
No tak ale dlaczego tak jest ze sesja się jakby sama dososowuje ?
Trudno będzie luka ;P Kiedyś ją poprawie. A co do sesion_destroy() to nie pomyślałem, szukałem sesion_stop(), sesion_kill() itp tongue.gif
misiek172
po 1 id sesji musisz przekazywać a) w cookie b ) post c) get, wybierz sobie jedną z metod smile.gif

potem na początku każdego dokumentu dajesz:
  1. <?php
  2. session_id($_REQUEST['PHPSESSID']);
  3. ?>
kiler129
jakoś nie rozumiem, po co dawać session_id($_REQUEST['PHPSESSID']); ?
PiratNowegoPokolenia
na razie zostawiaj session id w cookies ... bo ci się za bardzo za gmatwa smile.gif
i jak na razie tego nie musisz pisać
to znaczy pisz tylko session_start();
misiek172
tylko że jak ktoś ma wyłączone cookie to lipa, nie będzie działać. Sesja się utworzy inna nowa, a co za tym idzie skasują się zmienne. winksmiley.jpg
kiler129
Wiesz co tak serio to żadko widuje kogoś z wyłaczonymi ciachami tongue.gif
Co ja bym bez was zrobił ? W informacjach o skrypcie będa wasze nicki jako tych co nabardziej pomogli w pisaniu smile.gif
Wiec jak narazie beta 3 w 98% gotowa, tylko tworzenie userów zostało smile.gif

a tak na marginesie to jak skopiowac cały katalog wraz z zawartością ?
misiek172
zdaje mi się że nie ma konkretnego polecenia do tego... bedziesz musiał napisać sobię taką funkcje która tworzy katalog w danym miejscu o tej samej nazwie co katalog do skopiowania i potem kopiuj zawartość katalogu czyli pliki. Będzie musiał też pomyśleć o pęlach sprawdzających czy w katalogu nie ma drugiego katalogu ... troche zagmatwane i wymaga rekurencji.
kiler129
misiek172 mam wrżnie że ty jak widzisz jakieś zadanie to szukasz najtruniejszego rozwiaznia winksmiley.jpg
Z katalogu bede kopiowal do drugiego 3 pliki - download, index, logout i tworzył cfg smile.gif
Myślałem ze będe leniwy i zrobię tak ze tylko coś w stylu copy -> past i utowrze cfg a jednak musze kazdy plik kopiować tongue.gif Trundo smile.gif
misiek172
znaczy ja poprostu nie znam i nie słyszałem o poleceniu kopiującym folder z zawartością biggrin.gif chyba że byś uzył innego języka do tego niż PHP winksmiley.jpg

a jeśli chodzi o to kopiowanie to przecierz nei takie złe, pobierasz nazwy plików to tablicy oraz nazwe folderu. Tworzysz folder w danym miejscu i pętelką kopiujesz pliki do stworzonego folderu biggrin.gif
Heweliusz
Z tego co słyszałem, mechanizm sesi zawarty w php4 (chyba od 4 wersi) nie jest zbyt praktyczny i lepiej napisać własny jako bezpieczniejszy.
Mi samemu sesie napsuły krwi dry.gif
vokiel
Ja lubię sesje, więc Ci pomogę:

plik z formularzem logowania
form.html
  1. <form name="logowanie" method="POST" action="index.php">
  2. <input type="text" name="login" title="Pole loginu"> <br />
  3. <input type="password" name="haslo" title="Pole hasła"> <br />
  4. <input type="submit" name="submit" value="Loguj" title="Zaloguj">
  5. </form>


plik logowanie.php
  1. <?php
  2. if (isset($_POST['login']) && isset($_POST['haslo']))
  3. {
  4. //jezeli uzytkownik wlasnie podjal probe logowania
  5. $login = $_POST['login']; $haslo = $_POST['haslo'];
  6.  
  7. //sprawdzamy czy mamy użytkownika w bazie
  8. include ('polaczenie.php');
  9. $md5 = md5($haslo);
  10. $zapytanie = "SELECT * FROM uprawnieni WHERE login='$login' AND haslo='$md5';";
  11. $wykonaj = mysql_query($zapytanie);
  12. $wiersz = mysql_fetch_array($wykonaj);
  13.  
  14. if (mysql_affected_rows()>0) //istnieje uzytkownik o podanym loginie i hasle
  15. {
  16. $_SESSION['nazwa_uzytkownika']=$login; 
  17.  //zapisujemy kto się zalogował (później wykorzystamy do kontroli dostępu do katalogów)
  18. }
  19. }
  20.  
  21. if (isset($_SESSION['nazwa_uzytkownika']))
  22. {
  23. $print = "Zalogowany użytkownik.<br />
  24.  Witaj :<strong>".$_SESSION['nazwa_uzytkownika']."</strong>
  25. <a href="wyloguj.php">Wyloguj</a>"; //w wyloguj.php wstawiamy funkcję: session_destroy()
  26. }
  27. else
  28. {
  29. if (isset($login)) //jezeli proba lgogowania sie nie powiodla
  30. {
  31. $print = "<strong>Nieudane logowanie!</strong>";
  32. }
  33. else //nie bylo proby logowania lub nastapilo wylogowanie
  34. {
  35. $print = "Niezalogowany(a)</strong>";
  36. }
  37.  //tworzenie formularza logowania
  38.  $tworzenie_form=true;
  39.  }
  40.  ?>


plik index.php
  1. <?php
  2. include('logowanie.php');
  3.  
  4. if (isset($_SESSION['nazwa_uzytkownika']))
  5. {
  6.  echo $print;
  7. }
  8. else
  9. {
  10.  echo $print;
  11. //tworzenie formularza logowania
  12. if ($tworzenie_form==true)
  13. {
  14. include('form.html');
  15. }
  16. ?>


troche to na około ale działa,
odpalasz w przeglądarce plik index.php on wywołuje plik logowanie.php, jeśli nie było logowania lub było błędne to do zmiennej $print jest zapisywana stosowna informacja i wyświetlany jest formularz logowania. jeśli użytkownik się zalogował poprawnie to do zmiennej $print zapisywana jest jego nazwa i link do wylogowania.
Potem w plikach w tych folderach do których mają dostęp tylko wybrane osoby sprawdzasz:
  1. <?php
  2. if (isset($_SESSION['nazwa_uzytkownika']) && ($_SESSION['nazwa_uzytkownika']='nick użytkownika') )
  3.  {
  4. echo "Masz dostęp do tego katalogu:)";
  5.  } 
  6. else 
  7.  
  8.  {
  9. echo "Brak uprawnień!!! Wypad! ;)";
  10.  }
  11. ?>
misiek172
masz w ostatnim błąd po 1 w if dajemy do porównania '==' a nie '='

po 2 to

if (isset($_SESSION['nazwa_uzytkownika']) && ($_SESSION['nazwa_uzytkownika']='nick użytkownika') )

jest bez sensu, wystarczy samo

if ($_SESSION['nazwa_uzytkownika']=='nick użytkownika')

bo jeśli ma wartość to wiadomo że istnieje smile.gif przecierz nie może mieć wartość i nie być isset ;p
Kicok
Cytat
po 2 to

if (isset($_SESSION['nazwa_uzytkownika']) && ($_SESSION['nazwa_uzytkownika']='nick użytkownika') )

jest bez sensu, wystarczy samo

if ($_SESSION['nazwa_uzytkownika']=='nick użytkownika')

bo jeśli ma wartość to wiadomo że istnieje smilingsmiley.gif przecierz nie może mieć wartość i nie być isset ;p


Ale samo $_SESSION['nazwa_uzytkownika']=='nick użytkownika' wygeneruje wyjątek E_NOTICE, jeśli zmienna $_SESSION['nazwa_uzytkownika'] nie będzie zadeklarowana. A jeśli użytkownik nie będzie zalogowany, to ta zmienna raczej zadeklarowana nie będzie.
vokiel
@misiek172: racja '==' zamiast '=', literówka, proszę o wybaczenie...
Ja zawsze tak robię, że wpierw sprawdzam czy zmienna w ogóle istnieje, potem dopiero robie porównanie. Poza tym tak jest szybciej. Bo jeśli zmienna nie istnieje to po co porównywać wartości?
ReBeLs513
cześć. Mam problem... w pliku index i logowanie wyskakuje mi błąd:
"Parse error: parse error in H:\wamp\www\index.php on line 16". Możecie pomóc?
greycoffey
Cytat(ReBeLs513 @ 12.12.2010, 13:54:42 ) *
cześć. Mam problem... w pliku index i logowanie wyskakuje mi błąd:
"Parse error: parse error in H:\wamp\www\index.php on line 16". Możecie pomóc?


Nie, kurwa.
lord2105
Cytat(ReBeLs513 @ 12.12.2010, 13:54:42 ) *
cześć. Mam problem... w pliku index i logowanie wyskakuje mi błąd:
"Parse error: parse error in H:\wamp\www\index.php on line 16". Możecie pomóc?


A może tak plik index i więcej szczegolow?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.