![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Zrobiłem skrypt do logowania i z pomocą przyszły mi klasy Session z CI. Teraz sobie czytam o sesjach, że są robione po stronie serwera (odwrotnie niż ciastka - user-side).
Takie coś pisze w Class Session w UserGuide: Cytat Note: Cookies can only hold 4KB of data, so be careful not to exceed the capacity. The encryption process in particular produces a longer data string than the original so keep careful track of how much data you are storing. Najpierw czytam, że są to ciastka po stronie usera (w UG) a teraz, że sesja jest po stronie serwera. Jak to wreszcie jest z tą sesją? Ten post edytował adbacz 11.05.2011, 12:00:09 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Dane sesji trzymane są na serwerze, a identyfikator sesji w ciasteczku po stronie użytkownika. Dzięki niemu można rozpoznać która sesja należy do którego użytkownika.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za wyjaśnienie.
------- Żeby nie pisać nowego tematu. Chciałem oprzeć system logowania na ciastkach. Dodatkowo napisać funkcje, która będzie sprawdzała czy ktoś jest zalogowany czy nie i zwracała boolean TRUE lub FALSE. Wszystko ładnie popisałem, funkcja działała, tylko nie wykrywała ciastka. A wiedząc, że istniało, napsiałem w czystym pliku php wszystko to samo i wrzuciłem na serwer. Okazało się, że to co było w pliku, działało bez zastrzeżeń. Klasa wygląda tak:
I w miejscu gdzie chciałem to zasotować napisałem:
Okazało się, że to co napisałem działało prawidłowo, ale nie wykrywało ciastka o takiej nazwie (działało, bo po zamianie TRUE na FALSE i odwrotnie w funkcji całość zmieniało wynik). A jak napisałem to wszystko w jednym, osobnym pliku, bez kożystania z FW działało prawidłowo. Robię gdzieś jakiś błąd? Ten post edytował adbacz 11.05.2011, 12:10:11 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 306 Pomógł: 42 Dołączył: 25.03.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
W CI ciasteczka są popsute, że tak powiem, rób najlepiej na sesjach.
Kiedyś coś tam robiłem z ciastkami i miałem problemy, gdzieś wyczytałem, że mają bugi, ale systemik autoryzacji/autentykacji na sesjach działa bardzo dobrze. ![]() -------------------- Strony WWW: http://arscreo.pl
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Dzieki qrooel za wyjaśnienie. Teraz przynajmniej wiem na czym stoje
![]() BTW, sesje to trochę liche rozwiązanie bo wystarczy wyłączenie przeglądarki i juz nie jest się zalogowanym. Ale trudno, będzie trzeba coś pomysleć. Dzięki za info. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 006 Pomógł: 111 Dołączył: 23.07.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Wystarczy że ustawisz żywotność ciasteczka na dłużej. Np na tym forum nie muszę się logować co każde otworzenie przeglądarki, bo ciastko jest cały czas zapisane.
-------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
No dobrze, ciastka może i dam rade zwiększyć żywotność a co z sesją?
A może nawet i lepiej, że sesja tak działa. Teraz tak myślę, że jak dojdzie co do czego, to przecież jakieś ciacho można przechwycić i robić na nim co się chce. Z sesją, która jest po stronie serwera juz tak się nie da. Wydaje mi się to bardziej bezpieczne. Na prawde bezpieczniejsze czy tylko mi się wydaje? Ten post edytował adbacz 12.05.2011, 11:43:43 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 165 Pomógł: 20 Dołączył: 2.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Logowanie na ciastkach to się robiło z 10 lta temu. Nikt teraz nawet nie pomyśli o budowaniu logowania na ciastkach.
W CI jak i w PHP masz ustawianie czas sesji. w application/config.php wpis:
PS: NIGDY W ŻYCIU NIE OPIERAJ LOGOWANIA TYLKO NA CIASTECZKACH! Proponuje użyć jakiegoś gotowego systemu rejestracji/logowania użytkowników: http://codeigniter.com/wiki/Category:Libra...Authentication/ Tam wiadomo że jest w miare bezpiecznie jak kilku programistów nad tym siedziało. Ogólnie biblioteki do CI maja dość dobrą opinie jeśli chodzi o bezpieczeństwo. -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
No dobrze, to na czym oprzeć logowanie jak nie na ciastkach? Na sesji.
Poczytałem troche tamte artykuły ale znając siebie to dłużej mi zajmie przyswojenie tych skryptów co tam są i użycie ich do swoich potrzeb niż napisanie czegoś nowego. Szok, więc na czym jeszcze powinienem opierać system logowania? zapisywać SessionID w bazie dla danego loginu w osobnej tabeli? Tworzyć sesje tylko i wyłącznie takie, które będą istnieć do wyłączenia przegądarki? Zapisywać unikalny ciąg znaków (login, haslo, adresIP, godzinę i to wszystko w md5 lub sha1) dla danego usera w bazie danych i w sesji i dla sprawdzenia czy jest zalogowany, porównywać te dwa ciągi? Serio, ja juz sie trochę pogubiłem jak to najlepiej napisać. Sprawdzałem już nawet na niektórych portalach co zapisują w ciastkach, żeby mieć jakieś minimalne wyobrażenie jak Oni mogą to robić. PS. Wiem, że jestem namolny, i wiem, że może lepszym wyjściem byłoby wzięcie jakiegoś innego roziązania ale ja już tak mam, że wolę napisać coś sam niż brać czyjeś "wypociny" i znich korzystać. Ten post edytował adbacz 12.05.2011, 12:38:44 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 165 Pomógł: 20 Dołączył: 2.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Zrób to tak
Po poprawnym zalogowaniu zapisujesz w sesji informacje: Czy użytkownik jest zalogowany Jakieś dane typu: login, Imie, broń boże hasło ![]() i wtedy masz kod:
I potem przy sprawdzaniu logowania sprawdzasz:
Opcja wylogowania to poprostu usuwasz z sesji te dane, lub niszczysz cała sesję.
Lub poprostu:
PS. Wiem, że jestem namolny, i wiem, że może lepszym wyjściem byłoby wzięcie jakiegoś innego roziązania ale ja już tak mam, że wolę napisać coś sam niż brać czyjeś "wypociny" i znich korzystać. No i to jest podejście jakiś 80% koderów PHP (tych niedoświadczonych), A metoda DRY? http://pl.wikipedia.org/wiki/DRY To raz, a dwa, po co wymyślać kolo milion razy na nowo skoro ktoś już to zrobił? Jak są dobre biblioteki nie nazwał bym tego wypocinami, kod może napisać świetnej klasy programista, sprawdzony przez wiele innych programistów. Do tego piszesz stronę w frameworku CodeIgniter i to jest to samo, bo korzystasz z "wypocin" firmy ellislab i programistów którzy tworzą wspólnie ten projekt. Tam już jest masa kodu która jest napisana i ty z niego korzystasz. Zmięcie swoje podejście do programowania, bo dzięki takim podejścia potem ludzie piszą różne głupoty o programistach PHP, choć właśnie przez takie zachowania oni maja rację.... . Pozdro. Nie chciałem nikogo urazić, a tylko uświadomić. -------------------- |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Z tym co napisałeś, żeby w sesji zapisać czy użytkownik jest zalogowany to już tak robiłem, jesli jest wartość 1 to zalogowany - jeśli 0 lub brak, wylogowany. No ale i tak, oprócz tego musiałbym dać coś jeszcze, bo przecież takie informacje można zmienić.
Ale chwila, przecież to sesja... PS. Zrobiłem coś takiego. Główny kod llogowania:
I biblioteka Logowanie_lib.php:
Działa dobrze, tylko, że to i tak po wyłączeniu przeglądarki wszystko się "refresh" i już nie jestem zalogowany. To zapisywanie userID oraz ciągu znaków pod nazwą pass wziąłem z pewnego portalu znanego. Zauważyłem, że po zmianie obojętnie którego jestem automatycznie wylogowany więc uznałem, że to dobrze rozwiązanie. Tylko tak, mimo, że wyłącze przeglądarkę - nadal jestem zalogowany. Ten post edytował adbacz 12.05.2011, 15:20:33 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 165 Pomógł: 20 Dołączył: 2.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
OK przyj żyjmy się twojemu programowi:
Z tym co napisałeś, żeby w sesji zapisać czy użytkownik jest zalogowany to już tak robiłem, jesli jest wartość 1 to zalogowany - jeśli 0 lub brak, wylogowany. No ale i tak, oprócz tego musiałbym dać coś jeszcze, bo przecież takie informacje można zmienić. Ale chwila, przecież to sesja... ![]() ![]() ![]() PS. Zrobiłem coś takiego. Główny kod llogowania:
I biblioteka Logowanie_lib.php:
Działa dobrze, tylko, że to i tak po wyłączeniu przeglądarki wszystko się "refresh" i już nie jestem zalogowany. To zapisywanie userID oraz ciągu znaków pod nazwą pass wziąłem z pewnego portalu znanego. Zauważyłem, że po zmianie obojętnie którego jestem automatycznie wylogowany więc uznałem, że to dobrze rozwiązanie. Tylko tak, mimo, że wyłącze przeglądarkę - nadal jestem zalogowany. Jak Ci to działało to ja jestem na prawdę pod wrażeniem, i się dziwie że PHP taki kod w ogóle wykonał. Przykład szybkiego logowania, pisany na szybko, więc mogą być błędy, no i brakujemy modeli, zapytania są w kontrolerze. I nie sprawdzałem czy ten kod działa. Jak nie działa to rozkmiń jak go uruchomić.
Jak to Ci nie pomoże to proponuje powrót do podstaw PHP i przeczytać kilka razy a potem brać się za framework. Logowanie na sesji zawsze musi się kiedyś skończyć, w zależności od czasu jaki masz ustawiony w konfiguracji, ale zazwyczaj po restarcie przeglądarki sesja już zanika. Więc jedyne przetrzymanie tego to wrzucenie dopiero ciasteczka do klienta, i potem przy ponownym wejściu na podstawie tego ciasteczka dopiero zalogować użytkownika ponownie tworząc nową sesję. Brakuje konstruktora w controlerze ![]() -------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
*Tak ogólnie rzecz biorąc, to tam nawet nie napisałem porównania czy hasło w bazie i z formularza jest takie same. Miałem zamiar stąd to zapytanie do bazy.
*Dlaczego pole sesja? Żeby porównać ostatni zapis w bazie z aktualnym w ciastku. *Nie zapisuję hasła w sesji - została tylko nazwa pass. *Tak, identyfikator sesji, przy okazji miałbyć zapisywany w bazie, dla porównania. Wiem, że jest session_id, ale ta zmienia się co jakiś czas. *masz racje, mój błąd z tym sprawdzaniem czy jest FALSE w sprawdzeniu logowania *zapytanie w helperu by porównać ostatnie i aktualne IP. Ok, zaznajamiam się z PHP od 2 miesięcy a Ty mi takie pomyłki wynajdujesz ![]() Chyba faktycznie będę musiał sie troche podszkolić jeszcze. Co do tego wykonania, teraz nie wykona - niepotrzebnie go "obkomentowałeś" ![]() Wziąłem tyle różnych rzeczy do sprawdzania przy logowaniu bo przeglądałem ciastko, które CI zapisuje w przeglądarce i to wszystko co ja robię na sesji jest tam zapisywane, więc pomyslałem, że jeśli będę się opierał tylko na This->session->userdata('zalogowany') == TRUE, to moge mieć później problemy. Wybacz moją niekompetencje ale co do sesji i ciastek a tym bardziej kwestii logowania to jak widać noga totalna jestem. Dlatego też piszę tutaj, żeby ktoś wyłapał moje błędy i żebym sie poprawił. Ten post edytował adbacz 12.05.2011, 20:12:15 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 165 Pomógł: 20 Dołączył: 2.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Tu chodzi o to abyś zrozumiał jak to działa.
Mój kod się wykona jak dodasz konstruktor do kontrolera i będziesz miał taka bazę danych. Widać po prostu że w sieci jest mnóstwo kodu PHP który praktycznie nie nadaje się do niczego, to samo jest w kursach. Totalna porażka ... I potem CI ludzi uczą kolejnych jak coś się robi, skoro to powinno wyglądać inaczej. Najlepsza metodą na naukę jest czytanie cudzego kodu. Ale cudzego w sensie musi być to dobry kod abyś miał dobre nawyki. Zobacz jak wyglądają źródła frameworków typu: Kohana, CodeIgniter, Zend Framework, Symfony Przeanalizuj sobie, następnie przeanalizuj ich biblioteki np: właśnie do logowania i zobacz jak oni to rozwiązali. Wtedy się wiele nauczysz, przede wszystkim dobrych nawyków i jak takie rzeczy powinny być rozwiązane. No i przede wszystkim PHP w wersji obiektowej, jak to działa itp. Pozdro ![]() -------------------- |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Dziękuje za wyjaśnienie. Wiem na czym stoje.
Jeszcze jedno pytanie. Czy jeśli jest dane w sesji takie coś: to czy jest możliwe, żeby ktoś, kto przechwcił ciastko ci_session, mógłby go tak spreparować, żeby na innym komputerze być zalogowanym? Pytam bo nadal nie znalazłem odpowiedzi na to pytanie a bardzo mnie nurtuje. Jak bardzo to jest bezpieczne, i czy w ogóle. Ten post edytował adbacz 13.05.2011, 08:26:41 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 165 Pomógł: 20 Dołączył: 2.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Niema idealnych zabezpieczeń.
PHP ma to do siebie że sam każe Ci się zabezpieczyć, w CodeIgniterze rozwiązane jest to tak:
To jest przy każdej sesji zapisywane w ciasteczku, i potem przy ponownym wejściu weryfikowane. Jak korzystasz z frameworka, nie musisz się o to martwić, tylko korzystać z klas dostarczonych przez framework, Wtedy będzie bezpiecznie, choć jak wiadomo nigdy w 100% bo tak się po prostu nie da. -------------------- |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Ok, wziąłem to co napisałeś, zmodyfikowałem pod swoją baze i troszkę zmieniłem. Dodatkowo dodałem helper, aby sprawdzał czy jest ktoś zalogowany.
Logowanie:
I helper:
To wystarczy, czy warto jeszcze coś dodać? Ten post edytował adbacz 13.05.2011, 10:15:14 |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 165 Pomógł: 20 Dołączył: 2.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
No ok, tylko mała rada:
Nie stosuj headerów do przekierowania, jest do tego helper URL i w nim funkcja redirect(); http://codeigniter.com/user_guide/helpers/url_helper.html Raz stosujesz ActiveRecords do wykonania zapytania do bazy (sprawdzanie logowania) a przy updatcie piszesz kod SQL, Jedna zasada albo jedno albo drugie, zapewniam się że w Activerecords można budować na prawdę złożone zapytania. Bardzo dobrym rozwiązaniem będzie jak później jak już to sobie opanujesz, napiszesz bibliotekę do logowania i z niej będziesz korzystał. -------------------- |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Jeszcze małe pytanie bo mam wątpliwości co do bezpieczeństwa.
W sesji jest zapisywany UserID i boolean TRUE. A co jeśli np. zamieni sie cyfrę w UserID w ciastku, które zapisuje CI po stronie usera? Przecież, może być taka sytuacja, że po zamianie jednej cyfry nagle będziemy zalogowani jako ktoś inny. Ten post edytował adbacz 14.05.2011, 08:45:53 |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 165 Pomógł: 20 Dołączył: 2.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ale przecież UserID zapisywany jest w sesji, nie w ciastku.
W ciastku masz tylko identyfikator sesji zapisany nic więcej!. http://www.google.pl/webhp?hl=pl#hl=pl&...df534d0ed5380e6 http://www.google.pl/webhp?hl=pl#hl=pl&...df534d0ed5380e6 -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 10:28 |