gargamel
3.11.2010, 13:38:44
Przekopałem trochę forum, ale nie znalazłem tego czego dokładnie szukałem...
Takie tylko linki...
http://forum.php.pl/index.php?showtopic=35422http://forum.php.pl/index.php?showtopic=18535Chodzi mi o to na ile można ufać zmiennej $_SERVER['HTTP_REFERER'].
Wykorzystuję ową zmienną, aby zabezpieczyć formularz logowania. Logowanie odbywa się dopiero gdy login i hasło zostało przesłane z określonej strony.
Tylko wszędzie czytam że http_referer nie jest godzien zaufania
Jak to jest? Czy można jakoś (i w jaki sposób ) zmienić jego wartość i podszyć się pod stronę z której się logujemy?
http_referer jest wysyłany przez przeglądarkę... przy użycie httpLiveHeaders (dodatek do FF) można bez problemu zmienić wartość tej zmiennej
tehaha
3.11.2010, 13:58:08
nie polegaj na tej zmiennej, lepiej ustaw sobie zmienną w sesji
Crozin
3.11.2010, 14:24:08
Nagłówek REFERRER jest wysyłany przez klienta i może w nim być dosłownie wszystko.
Ochronę przed
CRSF robi się nieco inaczej. Na stronie z formularzem generujesz unikalny token, zapisujesz go jako zmienną sesyjną, a do formularza dodajesz ukryte pole z tym tokenem. Na stronie odbierającej formularz sprawdzasz czy przesłany token jest taki sam jak ten z sesji.
gargamel
4.11.2010, 13:12:55
No ok.
Tylko hmm... wyprowadźcie mnie z błędu, bo pewnie czegoś do końca nie łapie.
Mam powiedzmy 2 pliki:
index.php - z formularzem,
logowanie.php - skrypt sprawdzający przesłane dane i zapisujący do sesji to co trzeba.
Plik index.php tworzy token i zapisuje do w sesji. Ponadto ten sam token ląduje w ukrytym polu formularza.
Login hasło i token lecą do logowanie.php i tam jeśli przesłany token zgadza się z tym z sesji, następuje dalsza procedura logowania.
Tak to widzę, ale pewnie źle, bo:
Ktoś otwiera sobie index.php, zagląda w źródło i w ukrytym polu ma token jak na dłoni. W sesji jest on już ustawiony, więc można go wysłać razem z loginem i hasłem do logowanie.php skąd tylko chcemy...
Crozin
4.11.2010, 13:46:47
Tak, jeżeli to Ty bezpośrednio wchodzisz na tę stronę (w tym momencie serwer generuje unikalny token *dla Ciebie*), kopiujesz sobie ów token i wysyłasz dane. Serwer nie ma technicznej możliwości sprawdzenia czy otrzymane żądanie zostało wygenerowane formularzem.
Ten token ma uniemożliwić ataki typu CRSF czyli coś na zasadzie: na mojej - złej - stronie wstawiam sobie formularz z action ustawionym na Twoją stronę. Klikając robisz nieświadomie jakąś czynność w innym serwisie (np. usuwasz swoje konto/zdjęcia, zakładasz durny wątek na forum).