![]() |
![]() |
-ttdd- |
![]()
Post
#1
|
Goście ![]() |
Przeglądając temat http://forum.php.pl/index.php?s=&showt...st&p=971557 natrafiłem na post !*!, a dokładniej chodzi mi o bezpieczeństwo sesji.
Mam na swojej stronie przy logowaniu do panelu administracyjnego coś takiego (po poprawnym wpisaniu danych):
Do tej pory wydawało mi się to w miarę bezpieczne, ale po przejrzeniu w.w tematu zacząłem mieć wątpliwości. Tak sprawdzam czy administrator jest zalogowany i jeśli tak wyświetlam odpowiednią stronę: Czy taki sposób jest bezpieczny? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 329 Pomógł: 6 Dołączył: 23.11.2011 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Ja bym podczas logowania jeszcze generował id sesji który będzie w dodatek zakodowany np przez md5 i umieszczał bym go w linku a potem sprawdzał czy id sesji zgadza się z id w bazie danych oraz id które mamy w sesji.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Cytat i umieszczał bym go w linku a potem sprawdzał czy id sesji zgadza się z id w bazie danych oraz id które mamy w sesji. O losie... A jak ktoś skopiuje link dla ktosia innego to już nie zadziała... Zapomnij o przesyłaniu w linku czegokolwiek co dotyczy sesji, to jakiś chory i stary wymysł. Zrób funkcje, która będzie zamiennikiem dla Cytat $_SESSION['admin_logged'] = true; A w tej funkcji sprawdzaj czy właśnie dana sesja istnieje, czy zgadza się odstęp czasu dla ostatniej akcji i czy zgadza się user agent z IP, dodatkowo właśnie jakiś token, z md5/sha1 i powinno być ok, to skąd będziesz pobierać dane, czy sesja/czy baza, pliki czy cokolwiek to już nie ma znaczenia. -------------------- 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). |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 565 Pomógł: 15 Dołączył: 11.10.2010 Ostrzeżenie: (20%) ![]() ![]() |
Według mnie jeszcze możesz zrobić tak, że jeśli logujesz się z loginu np: "ttdd" to w kolumnie "logged" jest 1, a jak się wylogowujesz to 0
![]() ![]() Ten post edytował Dominator 25.06.2012, 18:52:32 |
|
|
-Gość- |
![]()
Post
#5
|
Goście ![]() |
ok już wiem co i jak, dzięki za pomoc
![]() |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 320 Pomógł: 29 Dołączył: 3.04.2010 Ostrzeżenie: (20%) ![]() ![]() |
A w tej funkcji sprawdzaj czy właśnie dana sesja istnieje, czy zgadza się odstęp czasu dla ostatniej akcji i czy zgadza się user agent z IP, dodatkowo właśnie jakiś token, z md5/sha1 i powinno być ok, to skąd będziesz pobierać dane, czy sesja/czy baza, pliki czy cokolwiek to już nie ma znaczenia. Czy naprawdę nikt tu nie rozróżnia samej idei działania sesji a jej implementacji? Chyba "trzymanie danych w sesji" znaczyło dla Ciebie "trzymanie danych używając domyślnej implementacji sesji w PHP", która de facto jest oparta NA PLIKACH. Można napisać mechanizm sesji obsługujący róźne źródła danych sesyjnych - nie ma znaczenia czy pliki, baza danych czy chmurowy pojemnik na dane. Według mnie jeszcze możesz zrobić tak, że jeśli logujesz się z loginu np: "ttdd" to w kolumnie "logged" jest 1, a jak się wylogowujesz to 0 ![]() ![]() Tak, wyłącze przeglądarke, sesja mi minie, nie zmieni się wartość kolumny logged i już się nei zaloguję. Takie mechanizmy blokujące trzeba dokładnie przemyśleć. Generalnie rzecz ujmująć, domyślna implementacja sesji jest bezpieczna na manipulacje, jeśli nie jesteś na shared hostingu, gdzie wszystkie sesje trzymane są w jednym katalogu (w tym wypadku możesz zmienić katalog w którym są przechowywane dane sesyjne) oraz gdy nie piszesz bezsensownego kodu pozwalającego na zmienianie danych sesyjnych w sposób niezamierzony. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
greycoffey - czepiasz się, plik plikowi nie równy, tak jak sesja, sesji. To tylko nazwy, a implementacja z zastosowaniem to inna bajka.
-------------------- 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). |
|
|
![]()
Post
#8
|
|
![]() Newsman Grupa: Moderatorzy Postów: 4 005 Pomógł: 548 Dołączył: 7.04.2008 Skąd: Trzebinia/Kraków ![]() |
miałem nie brać udziału w takich flame no ale na chęciach się skończyło...
powiedz co jest przesłanką do tego, że chcesz w jakikolwiek zmieniać coś w mechanizmie sesji? bo ja sensownego powodu nie widzę, jak wspomniał @greycoffey można zmienić miejsce zapisywania sesji ale po jakiego czorta zmieniać, cały mechanizm? bo jeśli nie masz konkretnego powodu uważam za głupotę zmieniać coś natywnego, na jakieś własne widzi mi się. -------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 320 Pomógł: 29 Dołączył: 3.04.2010 Ostrzeżenie: (20%) ![]() ![]() |
@up (tzn. !*!): Własna funkcja, która rozróżnia użytkowników to też sesja. Zresztą własna funkcja sesjopodobna bez podłączenia ją pod session_set_save_handler() to wyważanie otwartych drzwi w większości przypadków.
Ten post edytował greycoffey 25.06.2012, 19:55:32 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
piotrooo89 dlatego napisałem że greycoffey czepia się, bo nic nie wniósł do tematu, odnośnie mojej wypowiedzi. eot.
Ten post edytował !*! 25.06.2012, 20:13:24 -------------------- 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). |
|
|
![]()
Post
#11
|
|
![]() Newsman Grupa: Moderatorzy Postów: 4 005 Pomógł: 548 Dołączył: 7.04.2008 Skąd: Trzebinia/Kraków ![]() |
no moim zdaniem się nie czepia, tylko pokazuje zły tok myślenia niektórych. dał przykład jak można zaimplementować zmienne sesyjne, ale po tym dał wszystkim pstyczka w nos i powiedział po co tak robić skoro natywny mechanizm jest OK.
-------------------- |
|
|
-ttdd- |
![]()
Post
#12
|
Goście ![]() |
to sposób, który podał !*! jest dobry? bo już się pogubiłem w tym wszystkim, a właśnie zacząłem pisać funkcje.
I od razu mam pytanie bo jednak do końca nie zrozumiałem. Napisałem coś takiego: (logowanie)
Tu chyba jest wszystko dobrze? I funkcja sprawdzająca:
Nie wiem co dalej i czy w ogóle idę w dobrym kierunku ![]() |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 320 Pomógł: 29 Dołączył: 3.04.2010 Ostrzeżenie: (20%) ![]() ![]() |
Złe podejście do tematu. Generalnie domyślna implementacja sesji w PHP jest dobra, ale dla celów edukacyjnych warto napisać własną - poczytaj o session_set_save_handler, jak stworzysz odpowiednie funkcje i zlaczysz je w tej funkcji, możesz korzysta z własnej implementacji jak z domyślnej (operacje na $_SESSION, funkcje session_start(), session_destroy() etc.).
Po pierwsze, opierasz się na istniejącej sesji, zamiast stworzyć własną, co wprowadza niezły bajzel. Po drugie, hashujesz hash (w 99% przypadków session_id() zwraca ci md5() jakiegoś pseudolosowego ciągu). Po trzecie, tworzysz sztywne pola. We własnej implementacji najlepsze według mnie będzie struktura (taki pseudosql bo nie chce ci mieszac pewnych instrukcji dostępnych tylko w PgSQL):
Po czwarte, w miejscu ? chodziło pewnie o sprawdzenie czy funkcja zwraca 0 czy więcej rekordów. mysql_num_rows. We wspomnianej na początku funkcji zobacz "Example #2". EDIT: 2^8 post ;] Ten post edytował greycoffey 26.06.2012, 12:57:36 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Pierw odpowiedz sobie na pytanie czy sesja trzymana w bazie jest Ci w ogóle potrzebna.
-------------------- 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). |
|
|
-ttdd- |
![]()
Post
#15
|
Goście ![]() |
Pierw odpowiedz sobie na pytanie czy sesja trzymana w bazie jest Ci w ogóle potrzebna. no a jak nie? to ma działać tak: przy poprawnym logowaniu zapisuje sobie session_id() do tabeli admins w polu session_id i time() w polu last_active i do tego zapisuje session_id w sesji tak? ![]() dobrze myślę? |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 18:16 |