Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczeństwo skryptów PHP opratych na sesji
Forum PHP.pl > Forum > PHP
Michael2318
Zastanawiam się nad bezpieczeństwem skryptów opartych o php-owskie sesje oraz bazę MySQL. Załóżmy, że przy logowaniu, wyszukuję w bazie czy istnieje user o podanym haśle i nicku. Jeśli istnieje to tworzę sesję. No i właśnie... Do sesji nie powinno się przypisywać żadnych haseł/nicków, ale czy można przypisać ID danego usera? Co jeśli przypiszę sesję tak:

  1. $_SESSION['login'] = $user_id;


gdzie $user_id to np. 1, czyli admin? Czy to jest 100% bezpieczne rozwiązanie? No bo jeśli w jakiś sposób dałoby się zmienić zawartość sesji i ktoś przypisze sobie do swojej sesji 1 to automatycznie jest na koncie admina i robi co chce. Pytanie czy tak się da?

No i druga sprawa - dostęp do Panelu Admina (PA). Czy wystarczy, jeśli do PA będę wpuszczał osoby, które w bazie mają przypisane user_level (pole tinyint(1) default 0) == 1 ? Teoretycznie nikt sobie nie zmieni sam tej wartości bo musiałby mieć dostęp do bazy, a jesli już miałby dostęp do bazy to może wszystko, wiec czy taka alternatywa wytarczy, czy raczej trzeba dorzucić jakieś oddzielne logowania, cuda wianki?
pyro
Cytat(Michael2318 @ 2.02.2013, 11:43:54 ) *
Zastanawiam się nad bezpieczeństwem skryptów opartych o php-owskie sesje oraz bazę MySQL. Załóżmy, że przy logowaniu, wyszukuję w bazie czy istnieje user o podanym haśle i nicku. Jeśli istnieje to tworzę sesję. No i właśnie... Do sesji nie powinno się przypisywać żadnych haseł/nicków, ale czy można przypisać ID danego usera? Co jeśli przypiszę sesję tak:


A niby czemu nie można?

Nie pytaj czy można, tylko jak działają sesje, a to jest wytłumaczone w bardzo wielu miejscach na google.pl .

Jak zrozumiesz ich działanie to nie będziesz już musiał o cokolwiek pytać.
Michael2318
Cytat(pyro @ 2.02.2013, 11:57:38 ) *
A niby czemu nie można?


Ze względów bezpieczeństwa ;] Działanie sesji znam, pytam o ich bezpieczeństwo, przeczytaj to co napisałem jeszcze raz. Nie proszę o tutorial 'jak zrobić logowanie krok po kroku, oparte o sesje'.
pyro
Cytat
Działanie sesji znam


Nie znasz, bo te pytania:

Cytat
No bo jeśli w jakiś sposób dałoby się zmienić zawartość sesji i ktoś przypisze sobie do swojej sesji 1 to automatycznie jest na koncie admina i robi co chce. Pytanie czy tak się da?


Cytat
Jeśli istnieje to tworzę sesję. No i właśnie... Do sesji nie powinno się przypisywać żadnych haseł/nicków, ale czy można przypisać ID danego usera?


To właściwie są pytania o to jak działają sesje.

Odpowiadając na pierwsze pytanie dane takie da się modyfikować i odczytywać przy istnieniu innych luk w systemie, często przeze mnie spotykanych na hostingach współdzielonych. Takie ataki nazywają się session poisoning.
Michael2318
Cytat
To właściwie są pytania o to jak działają sesje.


Nie, to są pytania o bezpieczeństwo, konkretniej czy da się zmienić zawartość sesji z zewnątrz, nie widzę tu nic co tyczyłoby się działania sesji od strony PHP, ale nie będę się z Tobą spierał.
netmare
Da się zmienić zawartość sesji na współdzielonym serwerze, jeśli nie używasz jakiegoś włanego handlera, albo własnego ustwienia session.save_path.
Michael2318
W takim razie jakie będzie najlepsze ustawienie session_save_path() ?
reptile_rex
@up Po prostu inne niż domyślne na hostingu?

Dodatkowo należy zadbać o to, aby session id NIDGY nie było przekazywane w adresie.
netmare
Cytat(reptile_rex @ 2.02.2013, 15:31:54 ) *
Dodatkowo należy zadbać o to, aby session id NIDGY nie było przekazywane w adresie.


Uzasadnij proszę.
reptile_rex
Session Hijacking
netmare
Mnie osobiście to nie przekonuje. Moim zdaniem wykradnięcie identyfikatora sesji jest tak samo możłiwe z url jak i z cookie. Na twórcy strony spoczywa obowiązek zabezpiecznia przed uzyskaniem dostępu za pomocą wykradzionego identyfikatora. Ot, tyle jak dla mnie.
Damonsson
Nie do końca, znaczniej łatwiej wykraść url niż cookies, choćby referrer, głupota użytkownika, czy luki w przeglądarkach.
netmare
Ja nie napisałem że nie jest łatwiej, tylko że jedno i drugie jest możliwe. Nie zgadzam się po prostu z podejściem że nie zezwolenie na przekazywanie identyfikatora sesji w url'u jest receptą na bezpieczeństwo. Do tego pewnie są tacy użytkownicy którzy ciasteczek z różnych powodów nie zaakceptują i czy oni powinni być ignorowani?. Goły mechanizm sesji w PHP nie jest zabezpieczony w żaden sposób przed session hijacking ( a z tego co mi się kojarzy nie był kiedyś nawet przed null-byte), więc zawsze trzeba mieć na uwadze że jak chcemy dbać o bezpieczeństwo uzytkowników to musimy zabezpieczyć sesje sami. A jeżeli np mam stronę gdzie nie daje się użytkownikowi możliwości wstawiania treści, to zaryzukję stwierdzenie że przy zabezpieczeniu polegającym na porównywaniu referera z ostatnio odwiedzoną stroną (przy krótkim czasie życia sesji), to będziemy już tak samo bezpieczni na ciastku i na url-u. Więc chyba jednak dużo zależy od specyfiki strony i stwierdzenie że session id nigdy nie może być przekazywane w url-u jest nieco wyolbrzymione.
pyro
Cytat(netmare @ 3.02.2013, 22:45:31 ) *
Ja nie napisałem że nie jest łatwiej, tylko że jedno i drugie jest możliwe. Nie zgadzam się po prostu z podejściem że nie zezwolenie na przekazywanie identyfikatora sesji w url'u jest receptą na bezpieczeństwo.


Ale jest receptą na niebezpieczeństwo

Cytat(netmare @ 3.02.2013, 22:45:31 ) *
Do tego pewnie są tacy użytkownicy którzy ciasteczek z różnych powodów nie zaakceptują i czy oni powinni być ignorowani?


No cóż... niemal wszystkie istniejące strony oparte o PHP używają z ciasteczek, więc jak ktoś wyłącza ich obsługę to sam sobie szkodzi.

Cytat(netmare @ 3.02.2013, 22:45:31 ) *
Goły mechanizm sesji w PHP nie jest zabezpieczony w żaden sposób przed session hijacking ( a z tego co mi się kojarzy nie był kiedyś nawet przed null-byte)


Ahh... NULL byte... to były piękne czasy. Co do "gołego" mechanizmu PHP, sam w sobie nie zabezpiecza przed session hijacking, ale nie stwarza też sam z siebie zagrożenia tak jak robi to trans_sid = On

Cytat(netmare @ 3.02.2013, 22:45:31 ) *
A jeżeli np mam stronę gdzie nie daje się użytkownikowi możliwości wstawiania treści, to zaryzukję stwierdzenie że przy zabezpieczeniu polegającym na porównywaniu referera z ostatnio odwiedzoną stroną (przy krótkim czasie życia sesji), to będziemy już tak samo bezpieczni na ciastku i na url-u.


No cóż... ryzyko tym razem nie popłaciło, bo jako inny user łatwo odgadnąć jaki jest referer i go podrobić. Poza tym dużo użytkowników wyłącza w przeglądarce referer / user-agent.

Cytat(netmare @ 3.02.2013, 22:45:31 ) *
Więc chyba jednak dużo zależy od specyfiki strony i stwierdzenie że session id nigdy nie może być przekazywane w url-u jest nieco wyolbrzymione.


Nie jest wyolbrzymione, jednak rzeczywiście mogą mieć miejsce sytuacje, gdzie użycie trans_sid ma sensowne uzasadnienie. Ale to są rzadkie przypadki.
netmare
To w jednym się zgadzamy. Ale to z refererem... słów mi brakło, jaka w tym wypadku jest różnica między bezpieczeństwem cookie vs url?? albo masz dostęp do maszyny albo snifujesz nic więcej nie zrobisz. Warto czytać ze zrozumieniem zamiast się gadać, że się ryzyko nie opłaciło bo to stwierdzenie Tobie się nie opłaciło. Dajesz tutaj scenariusz ataku na url, który przy tych samych założeniach nie powiedzie się na cookie, nie ma wstawianej treści na stronę i nie ma linków na zewnątrz.

Edit: Co gorsza wydaje mi się że url będzie bardziej odporne na CSRF wink.gif
pyro
Cytat(netmare @ 4.02.2013, 08:25:46 ) *
To w jednym się zgadzamy. Ale to z refererem... słów mi brakło, jaka w tym wypadku jest różnica między bezpieczeństwem cookie vs url?? albo masz dostęp do maszyny albo snifujesz nic więcej nie zrobisz. Warto czytać ze zrozumieniem zamiast się gadać, że się ryzyko nie opłaciło bo to stwierdzenie Tobie się nie opłaciło. Dajesz tutaj scenariusz ataku na url, który przy tych samych założeniach nie powiedzie się na cookie, nie ma wstawianej treści na stronę i nie ma linków na zewnątrz.

Edit: Co gorsza wydaje mi się że url będzie bardziej odporne na CSRF wink.gif


To samo mi mówili ludzie, dla których aplikacji wykonywałem pełen audyt bezpieczeństwa na umowę. Zarzucono mi, że na siłę pakuję nieznaczące błędy do raportu, bo niby chcę więcej zarobić w ten sposób. Jak za jakiś czas wysłałem screenshot, w którym jestem zalogowany jako administrator z nowym nickiem, osoby te nigdy więcej nie zarzuciły mi próby naciągactwa. Mało tego nazwano mnie geniuszem, a nie trzeba być wcale geniuszem ("Ale jakto? Przecież był sprawdzany referer i user-agent!"), tylko znajomość działania danych technologii.

Cytat(netmare @ 4.02.2013, 08:25:46 ) *
To w jednym się zgadzamy. Ale to z refererem... słów mi brakło, jaka w tym wypadku jest różnica między bezpieczeństwem cookie vs url??
...
Warto czytać ze zrozumieniem zamiast się gadać


No widzisz - zarzucasz mi nieczytanie ze zrozumieniem, a sam nie czytasz tego co piszę, a dodatkowo wciskasz mi jeszcze coś na usta, czego nigdy nie powiedziałem. Nigdy nie twierdziłem, że przy sprawdzaniu referera jest większe bezpieczeństwo przy sesjach stricte cookie. Według mnie w obu przypadkach sprawdzanie referera to słabe zabezpieczenie (tak naprawdę to tylko niewielkie utrudnienie), a nie tylko w jednym z nich.
netmare
Po pierwsze dałem przykład i poprosiłem Cię o wskazanie korzyści w bezpieczeństwie na korzyść COOKIE w tym konkretnym przykładzie. Nie dałeś.

Po drugie nie twierdzę że sprawdzanie referera jest receptą na bezpieczną sesję.

Po trzecie cała nasza dyskusja zaczęła się od mojej opinii że stwierdzenie NIGDY jest nad wyrost. Sam nigdy nie dopuściłem przekazywania id w sesji, ale potrafię sobie wyobrazić kiedy bez obaw mógłbym na to zezwolić. Skoro robisz audyty bezpieczeństwa to chyba wiesz że złamać da się wszystko, tylko kwestia czy atak nie jest droższy od wartości zdobytej informacji. Dlatego myślę że można by powiedzieć zamiast NIGDY, np "staraj się unikać, jeśli nie rozumiesz zagrożeń z tym związanych lub nie ma szczególnych powodów do zezwolenia na to". Bo tak jakiś nowicjusz przeczyta to i zawsze będzie miał w głowie, że tak nie można bo mu stronę shaczą, nie rozumiejąc jak i dlaczego.

I to wszystko co miałem do powiedzenia w temacie. O zagrożeniach można by tu było sypnąć autorowi wiele lektur, ale on tylko pytał czy da się zmienić zawartość sesji, a ja o uzasadnienie poprosiłem kolegę reptile_rex sądząc, że być może ja o czymś nie pomyślałem, a nie po to żeby wywoływać burzę w szklance wody i czytać o przeprowadzoncyh audytach bezpieczeństwa (choć warto mieć w świadomości, że są tacy którzy przeprowadzają je nie posiadając stosownych umów :]).

Podsumowując proponuję zdrowy rozsądek, bo po co wdrażać zebrane do kupy pomysły wszystkich forumowiczów dla strony która dla zalogowanych wyświetla dowcip dnia.
Osoby biorące udział w tej dyskusji pozdrawiam serdecznie.

(Raczej nie będę kontynuował wypowiadania się w tym wątku bo zrobił się straszny offtop i zbędne bicie piany.)
pyro
Cytat(netmare @ 4.02.2013, 09:52:17 ) *
Po trzecie cała nasza dyskusja zaczęła się od mojej opinii że stwierdzenie NIGDY jest nad wyrost. Sam nigdy nie dopuściłem przekazywania id w sesji, ale potrafię sobie wyobrazić kiedy bez obaw mógłbym na to zezwolić. Skoro robisz audyty bezpieczeństwa to chyba wiesz że złamać da się wszystko, tylko kwestia czy atak nie jest droższy od wartości zdobytej informacji.


Nie wszystko, ale prawda jest niestety taka, że osób nie przestrzegających zasad bezpieczeństwa jest znaczny ogrom.

Cytat(netmare @ 4.02.2013, 09:52:17 ) *
Dlatego myślę że można by powiedzieć zamiast NIGDY, np "staraj się unikać, jeśli nie rozumiesz zagrożeń z tym związanych lub nie ma szczególnych powodów do zezwolenia na to". Bo tak jakiś nowicjusz przeczyta to i zawsze będzie miał w głowie, że tak nie można bo mu stronę shaczą, nie rozumiejąc jak i dlaczego.


No tak... ale czy warto stosować trans_sid tylko dlatego, że można? Jaki byłby w tym sens, skoro domyślnie w PHP jest wyłączone. Nie dość, że trzeba by zmieniać konfigurację, to jeszcze nie ma w tym większego celu. Poza tym wymyśliłeś sobie przykład, gdzie użytkownik nie robi nic na stronie, a wiadomo, że w znacznej większości skryptów opartych na sesjach user coś jednak robi. Dodatkowo:
Cytat(pyro)
Nie jest wyolbrzymione, jednak rzeczywiście mogą mieć miejsce sytuacje, gdzie użycie trans_sid ma sensowne uzasadnienie. Ale to są rzadkie przypadki.


Cytat(netmare)
I to wszystko co miałem do powiedzenia w temacie. O zagrożeniach można by tu było sypnąć autorowi wiele lektur, ale on tylko pytał czy da się zmienić zawartość sesji


No i temat cały czas o tym był.

Cytat(netmare)
(choć warto mieć w świadomości, że są tacy którzy przeprowadzają je nie posiadając stosownych umów :]).


Cytat(pyro)
audyt bezpieczeństwa na umowę


Cytat(netmare)
Podsumowując proponuję zdrowy rozsądek, bo po co wdrażać zebrane do kupy pomysły wszystkich forumowiczów dla strony która dla zalogowanych wyświetla dowcip dnia.
Osoby biorące udział w tej dyskusji pozdrawiam serdecznie.


No tak.. bo rzeczywiście dla strony wyświetlającej dowcip dnia warto tworzyć logowanie.

Cytat(netmare)
(Raczej nie będę kontynuował wypowiadania się w tym wątku bo zrobił się straszny offtop i zbędne bicie piany.)


Może być.
netmare
Cytat(pyro @ 4.02.2013, 10:27:09 ) *
No tak.. bo rzeczywiście dla strony wyświetlającej dowcip dnia warto tworzyć logowanie.


Jeśli znajdziesz 100 ludzi którzy zapłacą 1 zł sms-em za dostęp do tej treści to warto. Dodatkowo włączyć use_trans_id bo może znajdziesz jednego więcej.

Cytat(netmare @ 4.02.2013, 09:52:17 ) *
(...) złamać da się wszystko (...)


Cytat(pyro @ 4.02.2013, 10:27:09 ) *
Nie wszystko (...)


Mocne stwierdzenie. Chyba dysponujesz jakąś bezcenną wiedzą tongue.gif
pyro
Cytat(netmare @ 4.02.2013, 10:57:58 ) *
Jeśli znajdziesz 100 ludzi którzy zapłacą 1 zł sms-em za dostęp do tej treści to warto.


Nie rozumiem o co Ci chodzi z tym:

Cytat(netmare @ 4.02.2013, 10:57:58 ) *
Dodatkowo włączyć use_trans_id bo może znajdziesz jednego więcej.


Ale:

Kod
One: Hehe, chyba najlepszy żart jaki w życiu widziałem.
Two: Gdzie?
One: page.pl/funny_joke.php?PHPSESSID=123, tylko niestety trzeba wysłać SMSa za złotówkę
Two: I tak mi się niedługo odnawia abonament, a mam jeszcze dużo kasy na komie, to co mi szkodzi, wyślę sobie SMSa.
Two: Ale zaraz zaraz... Jak wszedłem na stronę to pokazał mi się dowcip, ale nie chciało żadnego SMSa. A dowcip niezły. Jakby chciało ode mnie to dałbym tę złotówkę ale tak to...


Cytat(netmare @ 4.02.2013, 10:57:58 ) *
Mocne stwierdzenie. Chyba dysponujesz jakąś bezcenną wiedzą tongue.gif


Chodzi o to, że po prostu niektórzy tworzą skrypty tylko tak, żeby działały. I na ten przykład:

Kod

https://secureweb.hqda.pentagon.mil/dpo/Details.asp?ID=108'

http://www.science.doe.gov/grants/announcements.asp?stat=4&fy_year=15'

http://www2.dla.mil/j-6/dlmso/elibrary/RecInfo.asp?seldsid=004030F832N0NP00'

https://legacyapps.mcsc.usmc.mil/question.asp?id=23

http://www.wiesbaden.army.mil/sites/about/phonebook.asp?page=p

http://iro.erdc.usace.army.mil/newsItem.asp?id=139'

http://eeoa.army.pentagon.mil/web/eeoc_org/key_personnel/bios.cfm?id=3

http://www.sexualassault.army.mil/news_view.cfm?id=9'

https://secureweb2.hqda.pentagon.mil/VDAS_ArmyPostureStatement/2011/information_papers/Posteddocument.asp?id=151"

http://www.usag.livorno.army.mil/wellnessd.asp?detail=47'

http://www.escwa.un.org/main/scroll/printwhatsnew.asp?id=561'

http://social.un.org/unpfiidata/UNPFII_Recommendations_Database_fulltext.asp?picfield=Description+of+Implementation&where='

http://www.ikd-m.africom.mil/getArticleFresh.asp?art=6000&lang=0'

http://social.un.org/unpfiidata/UNPFII_Recommendations_Database_view.asp?editid=19'

http://ocsdata.ncd.noaa.gov/nm/SupportImage.asp?ItemID=142989'

http://www.wdtb.noaa.gov/registration/registerv2.asp?section_id=1&block_id=2&class_id=17'

http://swfsc.noaa.gov/publications/swcpub/Publications.asp?PubYr='

http://www.roc.noaa.gov/wsr88d/Program/IFRAMES/ICDS/ICD/description.asp?ID=131'

http://www.oso.noaa.gov/poesstatus/componentStatusSummary.asp?spacecraft=14'

https://ssm.roc.noaa.gov/hotline/gsm.asp?site=KCBX'


Wszystko strony rządowe i wojskowe, a znalazłem je teraz w 3 minuty po przeczytaniu Twojego posta (nie moje linki). Rząd ma pieniądze, a nie może sobie pozwolić na taki wydatek, który stworzy bezpieczne strony i sieci, nie rozumiem tego paradoksu zupełnie.

Swoją drogą podczas ostatnich wyborów dane logowania do panelu administracyjnego PO to.... admin / admin.
netmare
Chodziło mi o prosty przykład strony o charkterze płatnym, wyświetlającej nawet jakiś stayczny html z treścią, nie wiem np nowelizacje ustaw. Większym zagrożeniem nieutoryzowanego dostępu będzie przekazywanie loginu niż to że ktoś będzie łamał sesję żeby oszczędzić złotówkę. Ja prowadząc taki szukałbym możliwości włączenia trans_id, żeby umożliwić dostęp większej ilości osób (nawet jeśli byłaby to 5 osób schylałbym się po to, zwłaszcza że się zrobiła nagonka na "CIASTECZKA" śledzące, wchodzą nowe regulacje prawne i pewnie ludzie zaczynają się zastanwiać na akceptowniem ciasteczek). Jeżeli chodzi o przekazanie linka to zawsze można wkleić komuś po prostu goły tekst i wyjdzie na to samo. W prostym zakresie zawsze można niskim nakładem zdecydowanie ograniczyć użyteczność przekazanego id. Do tego zawsze można odejść od sesji PHP i obsługiwać sesję po swojemu wg id w url-u, a wtedy zawsze można skomplikować bardziej kwestię nieautoryzowanego wykorzystania identyfikatora. W sumie napisanie własnych sesji nie jest jakąś czasochłonną magią, choć ze względów bezpieczeństwa nie polecałbym tego rozwiązania raczkującym w temacie bezpieczeństwa skryptów smile.gif.
pyro
Cytat(netmare @ 4.02.2013, 11:45:26 ) *
Chodziło mi o prosty przykład strony o charkterze płatnym, wyświetlającej nawet jakiś stayczny html z treścią, nie wiem np nowelizacje ustaw. Większym zagrożeniem nieutoryzowanego dostępu będzie przekazywanie loginu niż to że ktoś będzie łamał sesję żeby oszczędzić złotówkę.


Nie do końca, bo x lat temu nie raz na forach spotykałem się z linkami np. na forach, gdzie były doklejane sesje i wystarczyło kliknąć w link, żeby wejść jako zalogowany użytkownik (a potem w panelu był widoczny adres e-mail, można było zmienić hasło itp.). A gdyby tamten skrypt był oparty na ciasteczkach, to wklejenie takiego linku nic by nie dało. I takie sytuacje wynikały nie z głupoty użytkowników, tylko z nieznajomości działania aplikacji www, a przecież nie każdy musi się znać.

Cytat(netmare @ 4.02.2013, 11:45:26 ) *
Jeżeli chodzi o przekazanie linka to zawsze można wkleić komuś po prostu goły tekst i wyjdzie na to samo. W prostym zakresie zawsze można niskim nakładem zdecydowanie ograniczyć użyteczność przekazanego id.


page.pl/hidden_content.php - artykuły dostępne po zalogowaniu
page.pl/login.php - logowanie
page.pl/user_panel.php - dane użytkownika, zmiana hasła itp.

I teraz jest różnica czy ktoś wklei link page.pl/?PHPSESSID=123 (trans_sid = On), czy page.pl (trans_sid = Off) tak jak w przykładzie powyżej. Więc jednak nie wyjdzie na to samo.

Chyba starczy w tym temacie, bo kręcimy się już w kółko, a mnie już mdli od gadania o trans_sid smile.gif
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.