Autologowanie php

Witam :slight_smile: ,

piszę auto logowanie w php na ciasteczkach i mam parę pytań:

  1. Co mam zapisywać w ciasteczkach? tylko login, ale to nie jest dobry pomysł, bo przecież ktoś może zmienić w ciachach login i zalogować się na kogoś innego, może id sesji, hmm.

  2. Czy te dane jakoś szyfrować?

  3. Ogólny plan jest taki: wchodzi ktoś na stronę, ja requairuje sprawdzenie po czy istnieją ciasteczka i czy są ważne, jeśli tak to go loguję. ( Dobrze myślę?)

Proszę o skorygowanie oraz naprowadzenie mnie na odpowiedni tok myślenia, oraz aby mój system logowania był bezpieczny. Najbardziej zależy mi na odpowiedzi na pytanie 1.

pozdrawiam

Nie sam login, login i hasło z solą z hasha generowanego z innej soli np. zapisanej w bazie przy haśle usera generowanego z soli głównej + godziny rejestracji etc. Do tego możesz dodać jakąś główną sól. Ale to już zależy od ciebie. Czym więcej soli i dłuższy kod tym trudniej podmienić ten plik.

Czyli do ciastek mam zapisać hasło i login, a hasło i login mają być hashowane? Nie do końca zrozumiałem co z czym hashować, czy mógłbyś trochę jaśniej? :slight_smile:

login bez hasha, hasło hash. Z tym, że inny niż w bazie. Najlepiej z inną solą. Bo ogólnie jak się bawisz w pasy etc, powinieneś kodować na podstawie jakiejś soli, najlepiej innej dla każdego użytkownika. I potem na podstawie tej soli tworzysz kolejną i to nią przerabiasz twój hash od pasa.

drobok , ja jednak nie chciałbym przechowywać hasła na komputerze, nawet zahashowanego <- zawsze to większy poziom niebezpieczeństwa, jakaś alternatywa?

Nie masz hashować tym samym sposobem. Tak czy siak co chciałbyś tam przechowywać i tak musi mieć wysoki poziom bezpieczeństwa. Bo przecież gość zmieni se twoje odkryte id usera i już ma dostęp do admina :stuck_out_tongue:

Np bierzesz se hasha, i po kolei w stringu jedziesz i dodajesz losowy ciąg znaków i jakieś id do bazy ile ten ciąg ma. I wychodzi ci z kodowania dość długi ciąg, a gość bez dostępu do twojej bazy nie dorwie tego co chcesz. Oczywiście może zgadywać. Ale ty np możesz dać kilka randomów, zakładając tyle co znaków o długości od 0 do 9. I wtedy mamy ciąg w bazie o długości kodowania hasha + soli. Np 65909764765609023400. I tutaj pierw dodajemy 6znaków, potem jeden znak z soli itd. Potem sha1(md5) oc co znak ileś losowych. Takie coś już nie tak łatwo złamać, ale gdy dorwiesz bazę z kodem do randomów leżysz. W takim wypadku najlepiej trzymać dane na innym serwerze, sól jeszcze na innym. Ale wtedy masz większą szansę na awarię. Ogólnie nie ma metody idealnej. Możesz też przechowywać dane samego usera + datę ostatniego wejścia na stronę. I znów trzymasz wszystko w bazie. Sprawdzasz czy się zgadza.

Trzeba też niestety wziąć pod uwagę kradziesz ciastka na komputerze usera twojej strony. To już tak proste nie jest. Musiałbyś przechowywać w niej jakieś unikalne dane. Np jego ip, przeglądarkę etc. I wtedy sprawdzać czy wszystko się zgadza. Oczywiście wszystko kodowane osobnymi solami etc. Wszystko w jednym ciągu z losowymi wartościami pośrodku, w losowych miejscach. Oczywiście twoja baza wtedy będzie najsłabszym punktem. Bo user musiałby mieć to samo ip, tą samą przeglądarkę by się zalogować na to konto. Bądź znać sole, i randomy.

Btw moje sposoby to przerost formy nad treścią. Jak gość zauważy takie długie zlewające się ciastko, inne za każdym logowaniem, za każdym userem to da se spokój :stuck_out_tongue:

Dzięki za zaangażowanie w temacie :slight_smile:

Trochę skomplikowane to solenie, jak mógłbyś na przykładzie to byłbym wdzięczny, na chwilę obecną mam taką wizję:

  1. Do ciacha zapisuję czysty id usera oraz jakiś porządny hash, ale nie dotykam się hasła, hash zapisuję również do bazy.

  2. Ktoś wchodzi na stronę, sprawdzam czy istnieje sesja, jeśli nie sprawdzam ciasteczka, jeśli istnieją i są prawidłowe ( czyli hash w ciastku jest == hashu w bazie dla danego id), loguję gościa.

  3. Poprzez zapisanie hasha w ciastku i w bazie uniemożliwiam logowanie na admina poprzez podmienienie id, jak mu się podoba to niech sobie zmienia id ile chce :stuck_out_tongue:

Oceń powyższy kod pod kątem bezpieczeństwa jaki optymalności i ogólnie :stuck_out_tongue: , teraz mam dylemat z tą maksymalnie bezpieczną solą,

pozdrawiam :slight_smile:

Nie ma maksymalnie bezpiecznego i optymalnego. Równie dobrze możesz własnoręcznie wygenerować dowolny hash i dać go do ciastka, oraz do swojej bazy. A do tego jeszcze np dane przeglądarki również jakimś własnym szyfrowaniem zrobione. Ew w bazie przy logowaniu możesz zapisać przeglądarkę, by utrudnić kradzież hasła. Np inna przeglądarka niż w ciastku unieważniamy je.

właśnie mam taki zamiar swojego hasha, tylko jak go bezpiecznie wytworzyć?

Wytwórz losowy ciąg podobny do md5, zapisz do bazy i do ciastka, oczywiście za każdym razem gdy user się loguje, żeby potencjalny kopacz w kodzie myślał, że to hasło i tyle. Oczywiście całość najlepiej jakoś zlać czymkolwiek, by użyszkodnik nie miał łatwo ogarnąć co jest co.

ok, czyli nie będę tutaj do tego hasha “wmieszywał” żadnych danych związanych z użytkownikiem, bo po co :stuck_out_tongue: .

Na chwilę obecną robię tak, że w ciachu zapisuję id usera oraz hash, hash zapisuję również w bazie danych. id usera jest nie zahashowane. Przy wejściu usera na stronę pobieram ciacho, sprawdzam dla id z ciasteczka czy hash zgadza się z bazą, jeśli tak to go loguję.

Mam drugi problem:

Jeśli ktoś nie zaznaczy opcji autologowania to wtedy co zapisuję w bazie w polu hash? bo jak będę zapisywał np. 0 to wtedy jak ktoś sobie “wyczai”, że zapisuję do bazy 0, to za pomocą ciastek, po zmianie id zaloguje się na każdego, kto nie chce być autologowany?

Nie, masz zmieniać hash po każdym logowaniu usera. Wtedy ciastko wygasa gdy zaloguje się z innego komputera.

Gość włazi na strone sprawdzasz czy masz ciastko i sprawdzasz dane jeśli nie normalne logowanie, jeśli gość zaznacza autologowanie to tworzysz ciastko z nickiem i hashem, hash zapisujesz do bazy. Z każdym logowaniem danego usera zmieniasz ten hash, a pierwszy generujesz podczas rejestracji.

aha, czyli mam rozumieć, że nieważne czy user chce być autologowany czy nie, ja robię hasha w obydwu przypadkach, ale zapisuję go w ciastkach tylko jeśli chce być autologowany, a jeśli nie chce być autologowany to tylko i wyłącznie w bazie danych ( w tym wypadku ten hash nie jest w żaden sposób wykorzystywany, oprócz tego, że mam chronić przed zalogowaniem się z ciastek przez kogoś innego)

Dobrze myślę?

Tak, możesz też nie zmieniać tego hasha, gdy user nie chce być autologowany. Jednak wtedy masz mniejsze bezpieczeństwo. Bowiem wtedy ktoś może sobie próbować hashe na twoim forum.

Fakt, mogę nie zmieniać, ale dlaczego to ma zmniejszyć poziom bezpieczeństwa, bo tego nie rozumiem?

Mamy keya. Gość może puścić brute force skrypt, co będzie podmieniał ciastka i próbował wejść na stronę. Jednak może to zbytne udziwnianie ;]

jakby nie było zawsze można puścić brutalforce’a :wink: . Masz jakiś pomysł na porządny hash? Porządny, czyli taki maksymalnie bezpieczny, bo wiadomo, nie ma możliwości zrobić 100% bezpiecznego :slight_smile:

Właśnie dlatego zmieniasz podczas każdego logowania. Wtedy hash jest mało prawdopodobny do złamania. Możesz też zmieniać podczas każdej próby logowania. A jeśli ktoś się będzie próbował zalogować a hash będzie zły wyświetlić o próbie logowania na konto i prośbę o weryfikację ze względu właśnie na bezpieczeństwo.

Znaczy się, jak ktoś będzie się normalnie logował przez formularz to ja nawet nic w ciasteczkach nie będę sprawdzał, a jedynie hash będę tworzył. Może coś źle rozumiem?

Sprawdzasz ciastko przed logowaniem. Podczas logowanie w formularzu zmieniasz hash / unieważniasz ciastko. A jeśli ktoś ma ciastko zmieniasz hash w nim i w bazie. Możesz to robić również gdy logowanie się nie powiedzie. Wszystko zależy od twojej weny ;]