Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Proste logowanie - sesje
Forum PHP.pl > Forum > Przedszkole
pitbull82
Witam

Chciałbym w końcu zrozumieć chociaż w przybliżeniu, czym są sesje i jak to działa...

Dlatego też napisałem coś prostego, taki skrypt do logowania.

Chciałbym się Was spytać czy to w ogóle działa jak trzeba, czy nie da się włamać bez znajomości hasła itd. Czy hasło jest zapisywane gdzieś jako cookie? Bo niby zostało ono zarejestrowane jako zmienna sesyjna (może można tam zarejestrować dowolną inną zmienną pod którą znajdują się jakieś śmieci i skrypt będzie działał zupełnie identycznie?)

Proszę o spojrzenie.

SKRYPT uruchamiamy plikiem loguj.php a hasło do "systemu" to a smile.gif

Dodatkowe pytanie - co się stanie, jeśli ktoś zapomni nacisnąć WYLOGUJ? Da się jakoś zrobić, aby sesja wygasała po x minutach nieaktwyności?

loguj.php
  1. <?php
  2. function isValid($what)
  3. {
  4. $pass=&#092;"0cc175b9c0f1b6a831c399e269772661\";
  5. if (md5($what)==$pass)
  6. return true;
  7. return false;
  8.  
  9.  
  10. }
  11.  
  12. if (!isset($_REQUEST['proba']) || (isset($_REQUEST['proba']) && $_REQUEST['proba']<&& !isValid($_REQUEST[&#092;"haslo\"])))
  13. {
  14.  
  15. echo &#092;"<form method=\"post\" action=\"loguj.php\">\";
  16. echo &#092;"<p>\";
  17. echo &#092;"<input type=\"password\" name=\"haslo\" value=\"\" />\";
  18. echo &#092;"<input type=\"hidden\" name=\"proba\" value=\"\";
  19.  
  20. if (isset($_REQUEST['proba']))  
  21. {
  22. $temp=$_REQUEST['proba'];
  23. echo ++$temp;
  24. }
  25. else echo '1';
  26. echo &#092;"\" />\";
  27.  
  28.  
  29. echo &#092;"<input type=\"submit\" value=\"Wyślij\" />\";
  30. echo &#092;"</p>\";
  31. echo &#092;"</form>\";
  32.  
  33. }
  34. else if ($_REQUEST['proba']>=3)
  35. {
  36. die (&#092;"DOŚĆ!!!\");
  37. }
  38. else
  39. {
  40. session_register(&#092;"haslo\");
  41. header(&#092;"Location: strona1.php?\".SID);
  42. }
  43. ?>


strona1.php
  1. <?php
  2.  
  3. if (!session_is_registered(&#092;"haslo\"))
  4. {
  5. header(&#092;"Location: loguj.php\");
  6. exit();
  7. }
  8. // tutaj normalna tresc strony
  9. echo &#092;"NORMALNA TRESC STRONY 1 <br />\";
  10. echo &#092;"<a href=\"strona2.php?\".SID.\"\">STRONA 2</a>\"
  11.  
  12. ?>
  13.  
  14. <a href=\"wyloguj.php?<?php echo SID ?>>Wyloguj</a>


strona2.php
  1. <?php
  2.  
  3. if (!session_is_registered(&#092;"haslo\"))
  4. {
  5. header(&#092;"Location: loguj.php\");
  6. exit();
  7. }
  8. // tutaj normalna tresc strony
  9. echo &#092;"NORMALNA TRESC STRONY 2<br />\";
  10. echo &#092;"<a href=\"strona1.php?\".SID.\"\">STRONA 1</a>\"
  11.  
  12. ?>
  13.  
  14. <a href=\"wyloguj.php?<?php echo SID ?>>Wyloguj</a>

wyloguj.php
  1. <?php
  2.  
  3. if (session_is_registered(&#092;"haslo\"))
  4. {
  5. }
  6. ?>


UWAGA - dodatkowo, czy może mi ktoś wyjaśnić, czemu w pliku loguj.php wszystko musze napisać w 'jednym kodzie php"? Jeśli tak nie zrobię i zamykam ?> a następnie otwieram <?php tuż przed wypisaniem liczby prób, to nie zostaje rozpoznane, że zmienna już była w tablicy $_REQUEST i cały czas liczba prób jest 1 - nie rozumiem czemu tak jest, więc proszę o 2 słowa wyjaśnienia winksmiley.jpg

Pozdrawiam i czekam na pomoc
sf
session" title="Zobacz w manualu PHP" target="_manual - tutaj znajdziesz odpowiedzi na większość pytań bo widać odrazu po kodzie, że poprostu tam nie zajrzałęś w ogóle :|

pozatym stosuj $_POST i $_SESSION
pitbull82
Rzecz w tym, że manuala już przejrzałem, jednak sesje nie są wyjaśnione zupełnie tak jakbym chciał. Nadal niestety nie wiem, czu podany przeze mnie kod jest poprawny i bezpieczny, a jeśli nie, to co w nim jest nie tak sad.gif
sf
$_REQUEST - wiesz do czego to jest? to trzyma wszystko w jednym, uważasz, że to bezpieczne? Dla mnie to w ogóle dziwne bo mi się robi bałagan przy $_REQUEST, trzeba pamietać co jaką metodą się przesyłało.

Cytat
Użycie $_SESSION (lub $HTTP_SESSION_VARS dla wersji php 4.0.6 i starszych) jest wskazane ze względów bezpieczeństwa i czytelności kodu.


!

Cytat
$_REQUEST - a merge of the GET variables, POST variables and Cookie variables. In other words - all the information that is coming from the user, and that from a security point of view, cannot be trusted.


!

Cytat
Jeśli używane są tablice $HTTP_SESSION_VARS/$_SESSION i i wyłączona jest opcja register_globals, nie powinno się używać session_register(), session_is_registered() i session_unregister().


Pisze żeby tego nie stosować, a ty to stosujesz. Pamiętaj, że mówie tutaj o zmiennych globalnych wyłączonych bo jak NAPEWNO przeczytałeś mają one być wyłączone jeśli zależy nam na większym bezpieczeństwie.

Cytat
<?=SID?> nie jest konieczne jeśli przy kompilacji php użyta została opcja  --enable-trans-sid.


Względy estetyczne. Poprostu po co ciągle dodawać SID.

Jak chodzi o samo działanie skryptu to żadko, który programista po spojrzeniu na kod odrazu powie, że to bezpieczne. Poprostu trzeba to przetestować. Także analiza cudzego kodu czasami wydaję się zdecydowanie trudniejsza niż napisanie skryptu od nowa.

Też nie rozumiałem sesji na samym początku, nawet mi nie chciały działać. Jednak z czasem wykryłem bład (w ustawianich php.ini ) i zaczołem ich używać. Czytałem to forum, z 3 razy manual (z większym odstępem czasu), patrzyłem jak inni piszą skrypty z sesjami, jakie popełniają błędy i wyciągałem wnioski. Nikt odrazu wszystkiego nie pojmie.
pitbull82
Cytat("sf")
Względy estetyczne. Poprostu po co ciągle dodawać SID.

Być może rzeczywiście tak jest, ale u mnie na localhoście bez dodania nie działa sad.gif

Zmienne globalne oczywiście są wyłączone, ale w sumie to nie wiem co za różnica czy użyje w tym wypadku $_REQUEST czy $_POST, bo przecież dane które sprawdzam w $_REQUEST pochodzą z formularza, a nie są to zmienne sesyjne (chyba, że znów o czymś nie wiem)...

Pozdrawiam
czachor
Ustaw sobie session.use_trans_sid = 1 w php.ini i będziesz mógł pisać bez SID.
$_REQUEST nie rozróżnia, czy coś otrzymałeś przez COOKIE, POST czy GET. Jeżeli chcesz otrzymać przez POST, ktoś może dopisać do adresu ten sam parametr (GET) i $_REQUEST przyjmie odpowiednią wartość... Natomiast gdybyś używał $_POST i $_GET, dopisywanie parametru do adresu nic nie da, bo zmienna $_POST['x'] nie przyjmie danej wartości, będzie za to istniała $_GET['x'], która nie będzie nic zmieniała. Przykłądowo... Odbierając przez $_POST nikt Ci nie zasypie księgi gości setkami takich samych komentarzy, a przez GET (dopisanie parametru do adresu) można zrobić to w kilka sekund... odpowiedni skrypt w pętli i księgę gości będziesz wczytywał przez 3 godziny...
Mam nadzieję, że jakoś jasno wytłumaczyłem, bo trochę niewyspany jestem smile.gif
pitbull82
Myślałem, że $_REQUEST jest tak samo bezpieczne jak $_POST. Teraz już będę wiedział, że nie smile.gif

Z tym tylko, że nie to miało być głównym źródłem Waszych opinii, a sesje - czy je dobrze startuję, dobrze kończę i odpowiedzi na pytania z pierwszego posta smile.gif
czachor
Czas trwania sesji - session_cache_expire" title="Zobacz w manualu PHP" target="_manual. Sesja kończy działalność po zamknięciu przeglądarki, chyba że zniszczysz (unset" title="Zobacz w manualu PHP" target="_manual) ją wcześniej.
Dane sesji są trzymane w zależności od ustawienia session.save_handler w php.ini. Domyślnie jest to "files", czyli pliki (po stronie serwera w katalogu podanym w session.save_path).
Używaj $_SESSION. Niszcz zmienne przez unset($_SESSION['foo']).
emitra
Witam
Nie chcialem zakaldac nowego Tematu wiec podepne sie pod ten.

Mam problem z ciasteczkiami i moje podejrzenie padlo na SIDa chociaz zapewne nieslusznie ale mam andizje ze rozjasni mi ktos ten problem a mianowicie:

plik a.php
  1. <?
  2. //plik a.php
  3. $fighter_session=&#092;"ciassteczko\";
  4. $cookie_live = 5 * 60 * 60; // 5 godzin
  5.  
  6. setcookie (&#092;"fighter_session\", 111111, (time () + $cookie_live));
  7.  
  8. header (&#092;"Location: b.php\");
  9. ?>


plik b.php
  1. <?
  2. //plik b.php
  3. print &#092;"fighter_session = $fighter_session\";
  4. ?>


I teraz taki problem wszystko ladnie dziala na lokalu tzn w pliku b.php zmienna:
$fighter_session ma wartosc 111111
Niestety na serwerze zmienna nie jest przekazywana.
Zapewne to wina Ciasteczek. Czy fakt ze na serwerze gdzie nie dzialaja poprawnie jest ustawiony session.use_trans_sid=ON moze byc powodem ze tak isposob zapisywania ciasteczek jest nieprawidlowy ? bo tylko Taka roznice zauwazyłem w phpinfo() dodatkowo probowalem miast b.php odpalac plik info.php:
  1. <?
  2. ?>

i na serwerze nie ma zadnej wzmianki o wartosci 111111


Na localu:
session.use_cookies On
session.use_only_cookies Off
session.use_trans_sid Off

Na serwerze:
session.use_cookies On
session.use_only_cookies Off
session.use_trans_sid On



Ma ktos jaks rade dla Mnie ? Dodam ze Manulaa wciaz studiuje zaczynam czytac poraz kolejny wszystkie linki jakie padly na Tym forum i mozliwe ze cos przeoczylem wiec bede wdzieczny za cokolwiek jakas rade, skrypt lub zwykly link do manuala z odpowiednia funkcja gdzie moze byc rozwiazany moj problem.
Ja wracam do studiowania Manuala.

Pozdrawiam
scanner
1. register_globals
2. RTFM: http://pl.php.net/manual/pl/reserved.varia...riables.session
emitra
Cytat
1. register_globals

Zmienne globalne sa ON zapomnialem dodac sadsmiley02.gif


Cytat


Juz sie biore do czytania ;]


Tak czytam i czytam ale nurtuje mnie wciaz jeno pytanie dlaczego te cookiesy sie nie przesylaja porownalem wlasnie info z locala i z serwerka i poza "sidem" oraz Thread Safety ustawionym na disabled na serwerze nei widze zadnych roznic...

Jak ktos wie co moze byc powiodem niech napisze bo wieczorkiem ebde rozmawaial z adminem i ebdziemy proboweac cos na to poradzic dry.gif
czachor
$_COOKIE[]...
emitra
Cytat
$_COOKIE[]...


nie dziala juz sprawdzalem. Wogole w zadnej tablicy innej nie ma bo tak jak mowilem kazalem dla proby otworzyc miast b.php pli kz phpinfo() i wartosci ktora miala by tam byc wyslana nie ma nigdzie :/ Tak jakby na serwerze nie dzialaly cookies c odziwne by bylo z racji ze na koncie znajomego dziala phpbb sad.gif

----------
added:
Moze to pomoze:
a.php
  1. <?
  2. $cookie_live = 5 * 60 * 60; // 5 godzin
  3. setcookie (&#092;"fighter_session\", 123, (time () + $cookie_live));
  4. print &#092;"1 -> $fighter_session<br>\";
  5.  
  6. $fighter_session=$_COOKIE[&#092;"fighter_session\"];    
  7. print &#092;"2 -> $fighter_session\";
  8.  
  9. ?>


W wyniku czego na localu:

1 -> 123
2 -> 123

a nastepnie phpinfo sie wyswietla gdzie mozna w wielu miejscach spotkacj
_REQUEST["fighter_session"] 123
_COOKIE["fighter_session"] 123
itd

Natomiast na serwerze wysweitla sie:
1 ->
2 ->

a nastepnie phpinfo gdzie nie uswiadczymy ani:
_REQUEST["fighter_session"] 123
czy tez
_COOKIE["fighter_session"] 123

natomiast jedyne miesjce gdzie znajdujemy "123" jest w:

HTTP Headers Information
HTTP Request Headers
(...)
HTTP Response Headers
(...)
Set-Cookie fighter_session=123; expires=Tue, 07-Dec-04 10:56:48 GMT
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Transfer-Encoding chunked
Content-Type text/html


Z tego juz nic nie rozumiem bo wg tego cookiesy sie ustawiaja tzn ta linijka pozwlaa tak sadzic:
Set-Cookie fighter_session=123; expires=Tue, 07-Dec-04 10:56:48 GMT

ale z drugiej stroni zadna zmienna _request[] czy _cookie[] sie nietworzy blink.gif

O co chodzi ;p


---------------
no i dziala wystarczylo an chwile odpaczac od monitora i teraz ja kwrocilem odrazu rzucila mi sie w oczy godzina.
Okazuej sie ze na serwerze feralnym jest +7h tzn 23teraz inna strefa czasowa i ustawienie cookiesow na 5h nie wystarczalo ;p

Dziekuje wszystkim ktorzy zainteresowali sie problemem
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.