• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

cookie, sesje, a kwestie bezpieczeństwa

VPS Starter Arubacloud
0 głosów
934 wizyt
pytanie zadane 23 czerwca 2015 w PHP przez Kazuhiro Użytkownik (910 p.)
Witajcie. Żeby nie przeciągać przejdę od razu do rzeczy:

1. Jak wiadomo, cookie są przetrzymywane do komputerze lokalnym, co rodzi niezbezpieczeństwo odczytania, a może także zmodyfikowania tego pliku. Ja to robię w ten sposób, że w wartości cookie daję id usera i zaraz potem zakodowane hasło (sha1). Zakodowane (zahaszowane) hasło zawsze ma taką samą długość, więc łatwo jest także odczytać ID. Potem każdy skrypt sprawdza, czy dane z cookie są poprawnymi danymi logowania.

2. W kursie o tworzeniu skryptu logowania pewne wartości z bazy danych, np. drewno, złoto, nazwa użytkownika, itp. były przekazywane w zmiennych sesyjnych. Ja zawsze robię tak, że wysyłam jedynie ID a w pozostałych skryptach tworzę oddzielne zapytaniai wyciągam to, co jest mi w danej chwili potrzebne, Po pierwsze - wartości w bazie danych mogą ulec zmianie, a zmienna sesyjna za tym nie nadąży, np. na serwerze mamy CRONa, który zwiększa nam cyklicznie posiadane surowce. Takim układzie musiałbym za każdym razem modyfikować także zmienne sesyjne; 2 - nie wydaje mi się, żeby puszczanie samopas zbyt wielu zmiennych sesyjnych było dobrym rozwiązaniem ze wzlęgu bezpieczeństwa skryptu.

Zdaję sobie sprawę, że odcinek był czysto edukacyjny i nie sposób poruszyć w nim wszystkich kwestii ze względu na ograniczony czas. Dlatego chciałbym poszerzyć swoją wiedzę o te dwie rzeczy.

2 odpowiedzi

+3 głosów
odpowiedź 23 czerwca 2015 przez Comandeer Guru (599,730 p.)
wybrane 25 czerwca 2015 przez Kazuhiro
 
Najlepsza

NIE PRZECHOWUJ NIC POUFNEGO W COOKIES!

A jeśli przechowujesz, stosuj silny algorytm szyfrujący, np. AES.

Najlepiej w cookie trzymać jedynie id sesji a całą reszté danych na serwerze. I sprawdzaj zawsze czy IP i przeglądarka nie zmieniły się w sesji; jeśli tak, wyloguj usera.

No i cookie najlepiej słać z flagą http_only a jeśli masz SSL to koniecznie z flagą secure

komentarz 23 czerwca 2015 przez Kazuhiro Użytkownik (910 p.)
No dobra. Załóżmy, że w pliku cookie znajduje się wyłącznie id. Wtedy w skrypcie wywoływałbym zapytanie, które identyfikowałoby usera wyłącznie po jego identyfikatorze. Zmiana wartości pliku cookie spowodowałaby zalogowanie na konto innego użytkownika.
komentarz 23 czerwca 2015 przez Comandeer Guru (599,730 p.)
Ale nie id usera, tylko losowy identyfikator sesji! Wówczas nie ma żadnych danych o userze po stronie przeglądarki. No i do tego sprawdzałbyś czy zgadza się IP i przeglądarka
komentarz 23 czerwca 2015 przez Kazuhiro Użytkownik (910 p.)

Wiem, że są serwisy, które sprawdzają IP i przeglądarkę, ale załóżmy, że ktoś ma laptopa, tablet i PC. Nie da rady zapamięta hasła we wszystkich urządzeniach, ale to akurat nie jest duży problem.

Jak w cookie zapamiętać identyfikator sesji i potem przypisać go pod konkretnego usera? W taki sposób?

setcookie('log', $_SESSION['login'], time() + (86400 * 30));

a później do ustawienia sesji

$_SESSION['login'] = $_COOKIE['log'];

 

Dobrze Cię zrozumiałem?

komentarz 23 czerwca 2015 przez Comandeer Guru (599,730 p.)

Erm… Jeśli korzystasz z wbudowanego systemu sesji w PHP to po co wgl chcesz swoje dane dopisać do cookie?

Wiem, że są serwisy, które sprawdzają IP i przeglądarkę, ale załóżmy, że ktoś ma laptopa, tablet i PC. Nie da rady zapamięta hasła we wszystkich urządzeniach, ale to akurat nie jest duży problem.

Nie bardzo wiem o co chodzi? 

komentarz 24 czerwca 2015 przez Kazuhiro Użytkownik (910 p.)
Dlatego, że sesja kończy się w chwili zamknięcia przeglądarki. Mi chodzi o możliwość zapamiętania usera na dłużej.

Co do drugiej części, to są serwisy, które wylogowują usera, jeśli zaloguje się z innego IP, przeglądarki, etc. Sam z takiego serwisu korzystam. W momencie, kiedy zaloguję się do tego serwisu z Windowsa, jestem wylogowywany z Linuksa. Mnie to nie przeszkadza, ale niektórych oże to denerwować, jeśli korzystają z wielu różnych urządzeń.
komentarz 24 czerwca 2015 przez Schizohatter Nałogowiec (39,600 p.)
Albo np. jak działa konto Google, że na wielu serwisach jest jedno i to samo konto zalogowane? Prawdopodobnie wykorzystuje własny system zarządzania sesjami oparty na bazie danych.

Właściwie to traktuję to trochę jako minus, bo nie mogę być zalogowany na mailu jako X, a na YT jako Y...
komentarz 24 czerwca 2015 przez Comandeer Guru (599,730 p.)
Ale co mają niezależne sesje do wylogowywania pomiędzy różnymi urządzeniami? Jeszcze raz zaznaczę: operujemy na sesji, nie userze.

W Twoim wypadku faktycznie lepiej będzie stworzyć własny system sesji oparty na bazie danych
komentarz 24 czerwca 2015 przez Kazuhiro Użytkownik (910 p.)

Możesz podać przykład, jak zrobić to w praktyce? Jestem początkujący.

W necie znalazłem taki oto kod:

function islogged()
{
    global $dbc; //połączenie z bazą
 
    if (isset($_COOKIE['logged']))
    {
        $sql = mysqli_query($dbc, "SELECT user_id FROM sessions WHERE session_id='$_COOKIE[logged]' AND browser='$_SERVER[HTTP_USER_AGENT]'");
        $row = mysqli_fetch_array($sql);
        if (!empty($row))
            return $row['user_id'];
    }
 
    return 0;
}

Niby jest on jasny, ale...

W takim układzie mógłbym zrobić tak:

1. ustanowić sesję, a jej numer zapisać do bazy danych i do cookie.

2. Przy kolejnych odwiedzinach, system sprawdzałby, czy wartość pliku cookie jest taka sama jak ta w bazie danych.

3. Jeśli plik cookie nie znajduje się na komputerze, bądź jego wartość różni się od tego w bazie danych, wyświetl okno logowania (w razie konieczności wyloguj) i postępuj tak jak w pkt. 1.

Nie wiem, czy dobrze się zrozumieliśmy. Oczwyiście sam zapis uprościłem, ponieważ w oryginalnym kodzie następowało jeszcze porównanie przeglądarek. Cz takie postępowanie jest bezpieczne? Wiem, że są metody na przechwycenie ID sesji.

komentarz 24 czerwca 2015 przez Comandeer Guru (599,730 p.)

Flaga http_only dla ciastka ograniczy możliwości przeprowadzenia tego typu ataku, jednak warto dodatkowo identyfikować przeglądarkę (w końcu sesja w Chrome na Linuksie nie zmieni się nagle w sesję w Firefoksie na Windowsie) - co zresztą Twoje obecne zapytanie robi.

 

BTW zabezpieczyłbym to zapytanie, bo zarówno w ciasteczku, jak i w nagłówku User-Agent można dostać niezłe SQLi.

komentarz 24 czerwca 2015 przez Kazuhiro Użytkownik (910 p.)
Obecne zapytanie sprawdza przeglądarkę. W razie pojawienia się innej przeglądarki, nastąpiłoby wylogowanie.

Ten skrypt jest ściągnięty z Internetu. W swoich skryptach dane wprowadzone do zapytania zwykle przepuszczam przez wyrażenia regularne, a potem na wszelki wypadek, oczyszczam z niebezpiecznego kodu. Chociaż w tym konkretnym przykładzie nie ma danych pochodzących bezpośrednio od użytkownika.
komentarz 24 czerwca 2015 przez Comandeer Guru (599,730 p.)
Jak nie ma? User-Agent jest bezpośrednio od usera. Zresztą cookie tak samo - można spreparować żądanie z odpowiednim ciasteczkiem.
komentarz 24 czerwca 2015 przez Kazuhiro Użytkownik (910 p.)
edycja 24 czerwca 2015 przez Kazuhiro
Czyli wystarczy to przepuścić przez wyrażenia regularne + jakieś metody typu addslashes, htmlentities, etc?

A może zamiast informacji o przeglądarce zapisywać po prostu IP?
komentarz 24 czerwca 2015 przez Comandeer Guru (599,730 p.)

W PHP jest tylko jeden prawdziwy sposób na ochronę przed SQLi: prepared statements.

W ostateczności jest jeszcze funkcja mysqli_real_escape_string

+3 głosów
odpowiedź 23 czerwca 2015 przez toaspzoo Dyskutant (8,300 p.)
Nigdy ale to NIGDY nie zapisuj hasła do cookies. W jakiejkolwiek postaci.

Skoro dane surowców się aktualizują (w bazie danych?) cronem, to dlaczego chciałbyś zapisywać to jeszcze do sesji? Odczytuj z bazy i tyle.
komentarz 23 czerwca 2015 przez Kazuhiro Użytkownik (910 p.)
No właśnie ja odnosiłem się do filmiku Pana Mirosława w którym stosował taką metodę.
komentarz 23 czerwca 2015 przez toaspzoo Dyskutant (8,300 p.)
Nie uwierzę póki nie zobaczę, daj proszę link do materiału ;)
komentarz 23 czerwca 2015 przez Kazuhiro Użytkownik (910 p.)
https://www.youtube.com/watch?v=Pp578w7C9hE

Tylko w tym materiale nie było mowy o cronie.
komentarz 25 czerwca 2015 przez toaspzoo Dyskutant (8,300 p.)
Masz dokładny czas, gdzie jest pokazana metoda zapisywania hasła do cookies?
komentarz 26 czerwca 2015 przez Kazuhiro Użytkownik (910 p.)
Nie mówiłem o zapisywaniu haseł do cookies, tylko o przesyłaniu wyciągniętych z bazy danych w sesji. Cookie w tym materale nie było (1:10:27)

Podobne pytania

0 głosów
1 odpowiedź 357 wizyt
pytanie zadane 18 września 2016 w PHP przez MatiiTv Gaduła (3,790 p.)
0 głosów
1 odpowiedź 239 wizyt
pytanie zadane 7 października 2018 w JavaScript przez rafal.budzis Szeryf (85,260 p.)
–1 głos
0 odpowiedzi 85 wizyt
pytanie zadane 5 grudnia 2018 w PHP przez kamiz Obywatel (1,010 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...