Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy cookie są bezpieczne ?
Forum PHP.pl > Forum > PHP
MOniToR
Mam zamiar zrobić dośc dużą stronę. Chciałbym przechowywać uprawnienia użytkowników w ciasteczkach ale nie wiem czy sa one wystraczające bezpieczne. Czy istnieje możliwośc aby ktoś upierdliwy stworzył/edytował na swoim kompie cookie, które by mu wtedy dawały okreslone uprawnienia na stronie?
Yarecki
To są pliki txt, także każdy może w nich grzebać.

Lepiej przechowywać takie dane w sesjiach, po stronie serwera.
dr_bonzo
User moze (w Operze prosciutko) edytowac cookiesy. Uprawnienia NIE MOGA byc przechowywane u usera tylko u ciebie (na twoim serwerze).

User loguje sie na twojej stronie -- czyli posiada jakies konto -- do tego konta sa przyporzadkowane uprawnienia i tyle.
MOniToR
No tak, ale chciałbym aby dane były w cookies ponieważ chcem zrobic taką opcję jak'loguj automatycznie'. I teraz nie wiem jak to zrobić, bo nawet jeżeli dam w ciasteczkach samo id usera, to i tak ktos kto będzie chciał uprzykrzyc życie włascicielowi strone wyedytuje w cookies swoje id na id admina. Możecie mi w tym cos poradzić ?
Kuziu
To może dodaj do cookies poza ID także zahashowane hasło funkcją np. md5().

Dzięki temu nikt nie wyedytuje jednocześnie ID oraz HASŁA w dodatku zahashowanego.

I przy każdej akcji na stronie ... sprawdzaj czy zahashowane hasło z cookies zgadza się z zahashowanym z bazy danych.
Puciek
Czyli żeby przedstawić ci to w praktyce
  1. <?php
  2. if( !( empty( $_COOKIE['login'] ) ) && !( empty( $_COOKIE['haslo'] ) ) )
  3. {
  4.  sprawdz_login( $_COOKIE['login'], $_COOKIE['haslo'] );
  5.  pobierz_uprawnienia( $_COOKIE['login'] );
  6. }
  7. else
  8. {
  9.  formularz_logowania();
  10. }
  11. ?>
Gdzie przyjmiemy że funkcja "sprawdz_login" sprawdza czy jest poprawne hasło do logina a formularz_logowania wyświetla odpowiedni do zalogowania sie formularz a pobierz_uprawnienia jak można wywnioskować poprstu je pobiera ^^
Yarecki
Hmm ja bym w ciastku trzymał login i md5( $login . md5( $password ) ).
Puciek
Cytat(Yarecki @ 2005-02-22 14:35:17)
Hmm ja bym w ciastku trzymał login i md5( $login . md5( $password ) ).

Toteż jest to logiczne, tu niema samego logowanie tylko juz pobieranie hasla ktore jest zakodowane w md5 ^^

UPDATE
Jak bedziesz mial login w md5 to jak kogos zalogujesz ^^ ?
mhs
Cytat(Puciek @ 2005-02-22 16:11:49)
UPDATE
Jak bedziesz mial login w md5 to jak kogos zalogujesz ^^ ?

moze mniej wiecej takie zapytanie bedziesz wysylal do bazy danych?

  1. SELECT
  2. *
  3. FROM userzy WHERE login = md5('login') AND haslo = md5('haslo')


- jezeli takie zapytanie zwroci wiersze to znaczy ze uzytkownik istnieje...
Puciek
hmm
albo zle rozumuije albo on bedzie wtedy w bazie przechowywal uzytkownikow w md5, dobrze rozumuje ?
mhs
Cytat(Puciek @ 2005-02-22 16:24:08)
hmm
albo zle rozumuije albo on bedzie wtedy w bazie przechowywal uzytkownikow w md5, dobrze rozumuje ?

ech to... ja namieszalem...
myslalem o zapytaniu tego typu:

  1. SELECT
  2. *
  3. FROM uzytkownicy WHERE md5(login) = '0db2af75179fb9dbe097af182d442a4a';



gdzie '0db2af75179fb9dbe097af182d442a4a' - zhaszowany login pobrany z ciastka


sorry...
hawk
Podobno najstarsi górale używają do tego... sesji biggrin.gif.

Jakie to ma znaczenie, czy login/hasło są zaszyfrowane, jeżeli muszę tylko zesniffować cookie i wysłać do serwera? Chociaż dochodzimy tutaj do SSL, bez którego nie ma mowy o bezpieczeństwie.

Login/hasło w cookie są również niebezpieczne z dwóch innych powodów
- nawet zaszyfrowane md5 są do złamania; md5 to już przestarzały algorytm
- na komputerze zostaje cookie z wszystkimi danymi potrzebnymi do włamania się na konto danego usera
Puciek
Cytat(hawk @ 2005-02-22 16:32:50)
Podobno najstarsi górale używają do tego... sesji biggrin.gif.

Login/hasło w cookie są również niebezpieczne z dwóch innych powodów
- nawet zaszyfrowane md5 są do złamania; md5 to już przestarzały algorytm
- na komputerze zostaje cookie z wszystkimi danymi potrzebnymi do włamania się na konto danego usera

Wystarczy kilka dni bruteforca na silnej maszynce i po rpoblemie, ale to już inna para kaloszy.
W pelni zgadzam sie co do sesji ale wtedy musialbys logowac na podstawie IP a nie zachowanego cookie ^^
MOniToR
hmm może mi ktos powiedziec jak zakodowac text w md5 i potem odkodowac (wiem, len jestem tongue.gif)? ;> Sesje sa dobre, ale ja che mieć opcje 'loguj automatycznie' aby użytkownicy nie musieli się za każdym razem logowac. A ma ktoś jeszcze jakiś pomysł jezeli md5 nie jest takie bezpieczne ? Robie naprawde spory serwis i musze się dobrze zabezpieczyc.
slash^
zakodowanie:

  1. <?php
  2. $txt = &#092;"blablub\";
  3. $zakodowane = md5 ($txt); 
  4.  
  5. echo $zakodowane;
  6.  
  7. ?>


md5 to hash - nie odkodujesz tego

a bezpieczeństwo z "loguj automatycznie" + "cookies" -> nie istnieje

ale pomysl o SSL
MOniToR
To jak mama sprawdzic czy uzytkownik wpisal dobre haslo jeżeli jego hasło jest zakodowane a ja nie moge tego odkodować ? ;E
Nievinny
Sprawdzasz kodując hasło które podał i wersję zakodowaną porównać z zakodowanym z bazy danych
MOniToR
Cytat(Nievinny @ 2005-02-22 18:38:41)
Sprawdzasz kodując hasło które podał i wersję zakodowaną porównać z zakodowanym z bazy danych

to jak uzytkownik bedzie mógł się logowac swoim hasłem jeżeli będzie ono zakodowane ?
Yarecki
Cytat(Puciek @ 2005-02-22 15:11:49)
Cytat(Yarecki @ 2005-02-22 14:35:17)
Hmm ja bym w ciastku trzymał login i md5( $login . md5( $password ) ).

Toteż jest to logiczne, tu niema samego logowanie tylko juz pobieranie hasla ktore jest zakodowane w md5 ^^

UPDATE
Jak bedziesz mial login w md5 to jak kogos zalogujesz ^^ ?

Chodziło mi o to, że w bazie login jest normalnie zapisany, a hasło zahaszowane.

W ciastku natomiast trzymać tylko login i hash [loginu + hasła] z bazy, lub sam hash [loginu + hasło] z bazy.

W taki sposób można jednoznacznie określić użytkownika, nie podając mu konkretnych danych. Utrudnia to też _trochę_ brute force bo trzeba najpierw rozgryżć ten zlepek [login + haslo] i dopiero wtedy można rozgryzać hasło.
slash^
Cytat(MOniToR @ 2005-02-22 19:20:37)
to jak uzytkownik bedzie mógł się logowac swoim hasłem jeżeli będzie ono zakodowane ?

w bazie trzymasz w tabeli:

Kod
id  login      haslo
1   admin    hash
2   user      hash


w skrócie: w bazie danych zapisujesz hasla juz zahashowane przez md5.

User logując się wysyła przez formularz do skryptu:
-> $login
-> $haslo

skrypt przerabia haslo na hash w md5
$hashHaslo = md5($haslo)

budujesz zapytanie sql
select * from login where login = $login and haslo = $hashHaslo;

...
goldenlord
Jak już się bawisz w to zapamiętywanie czy ktoś się na stałe zalogował czy nie to łatwiej stworzyć sobie jakiś string, dodać go do nazwy usera, potraktować md5 i wstawić do ciastka np.

  1. <?php
  2. $stupid_hash = 'kobyłamamałybok';
  3. $_COOKIE['user_name'] = 'user';
  4. $_COOKIE['user_hash'] = md5 ($user_name . $stupid_hash);
  5.  
  6. // Po tym jak odwiedza stronę po długim czasie
  7.  
  8. $new_hash = md5 ($_COOKIE['user_name'] . $stupid_hash);
  9. if ($new_hash == $_COOKIE['user_hash']) 
  10. {
  11.  // Zalogowany
  12. }
  13. ?>


Wtedy jak nawet wyedytuje sobie ciastko u siebie na kompie to nic mu to nie da, i masz z głowy ewentualne obciążanie bazy zapytaniami...
MOniToR
Ktos chyba nie zrozumiał mojego ostatniego popsta, chodzi mi o to, że uzytkownik nie wpisze w formularzu przecierz zakodowanego hasła tylko swoje, które ustawił. I jak sprawdzic czy to prawdziwe
Kuziu
W bazie masz zakodowane przez md5() tak ?

Użytkownik wysyła nie zakodowane tak ?

Porównujesz Hasło z bazy nie kodując go bo już jest zakodowane z md5($haslo) które przyjdzie z formularza.

Czyli w bazie masz zakodowane a to od użytkownika kodujesz w locie

  1. <?php
  2.  
  3. if($sql_pass == md5($form_pass)){
  4.  
  5. }
  6.  
  7. ?>


Co za tym idzie porównujesz czy HASH'e sie zgadzają.
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.