Wskazówki dotyczące podpisanych plików cookie zamiast sesji

Rozważam porzucenie PHP $_SESSION (tj. obsługę sesji po stronie serwera, aby dodać trochę agnostycznego smaku) i użycie podpisanych plików cookie, ponieważ słyszałem o nich tyle dobrego(Flickr używa ich, więc powinny być wystarczająco dobre dla mnie).

Rozumiem podstawowy kontekst tej techniki: używaj plików cookie do swobodnego przekazywania par klucz-wartość z Klienta na serwer i podpisuj je, aby upewnić się, że wartości nie są modyfikowane.

Ale co by było dobrym sposobem na zaimplementować część podpisywania? Również; ponieważ ruch będzie prawdopodobnie HTTP, czy istnieje dobry sposób, aby wysłać wrażliwe dane (takie jak hasło użytkownika) z tej metody, podczas pracy przeciwko kradzieży plików cookie i/lub manipulacji?

Author: Henrik Paul, 2009-02-07

3 answers

Po co się trudzić? Nie używałbym tej techniki do poufnych danych. Może to być przydatne w połączeniu ze zwykłą sesją - możesz dać klientowi plik cookie o normalnym identyfikatorze sesji, ale także zawierać wszystkie pary klucz/wartość, których potrzebuje Twoja aplikacja na każdej stronie. W ten sposób można uniknąć trafienia do magazynu sesji dla każdego żądania strony.

Należy dążyć do zachowania dużej ilości danych, ponieważ będą one wysyłane z każdym żądaniem.

Z tym w Uwaga, naprzód...

Podpisywanie danych za pomocą skrótu

Jeśli dane nie są wrażliwe, możesz podpisać wartości za pomocą sha1 hash utworzony z kombinacji par klucz/wartość i współdzielonej tajemnicy. np.

$values=array(
  'user_id'=>1,
  'foo'=>'bar'
);
$secret='MySecretSalt';

$plain="";
foreach($values as $key=>$value)
{
    $plain.=$key.'|'.$value.'|';
}
$plain.=$secret;
$hash=sha1($plain);

Teraz daj klientowi plik cookie ze wszystkimi wartościami i hash. Możesz sprawdzić hash, gdy plik cookie jest prezentowany. Jeśli hash obliczany na podstawie wartości prezentowanych przez Klienta nie odpowiada oczekiwanemu hashowi, wiesz, że wartości zostały zmodyfikowane z.

Szyfrowanie poufnych danych

W przypadku poufnych danych musisz zaszyfrować wartości. Sprawdź rozszerzenie mcrypt , które oferuje wiele funkcji kryptograficznych.

Kradzież ciasteczek

Jeśli chodzi o kradzież plików cookie, jeśli umieszczasz dane uwierzytelniające użytkownika w pliku cookie i ufasz mu, to ktoś, kto uzyska ten plik cookie, może podszywać się pod tego użytkownika, dopóki hasło nie zostanie zmienione. Dobrą praktyką jest zapamiętanie sposobu uwierzytelniania użytkownika i tylko przyznaj określone uprawnienia, jeśli użytkownik jest wyraźnie zalogowany. Na przykład w przypadku forum Możesz pozwolić komuś pisać, ale nie zmieniać danych konta, takich jak adres e-mail.

Istnieją inne techniki plików cookie "autologin", polegające na nadaniu takim plikom wartości tokenu, które można wykorzystać tylko raz. oto dobry artykuł na temat tej techniki.

Możesz również spojrzeć na włączenie IP klienta do podpisanego pliku cookie, a jeśli nie pasuje do IP prezentującego plik cookie, niech się znowu zalogują. Zapewnia to większą ochronę, ale nie będzie działać dla osób, których pozorny adres IP ciągle się zmienia. Możesz uczynić z niej funkcję opcjonalną i dać użytkownikowi możliwość rezygnacji. Po prostu próżna myśl, nie widziałem tego w praktyce :)

Ładny artykuł, który wyjaśnia kradzież sesji, porwanie i utrwalenie zobacz Sessions and Cookies, który oferuje kilka technik do wypróbowania, takich jak użycie nagłówka User-Agent jako dodatkowego podpisu.

 23
Author: Paul Dixon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-25 17:33:59

Zrobiłam CookieStorage dokładnie w tym celu. Wszystkie zapisane wartości są bezpiecznie podpisywane kluczem prywatnym za pomocą haszowania RIPEMD160( i z czasem) i opcjonalnie szyfrowane za pomocą RIJNDAEL256.

Każda wartość jest przechowywana ze znacznikiem czasu, który można pobrać.

Signed example .
zaszyfrowany przykład .

Jeśli wolisz, możesz użyć funkcji hash/encrypt/decrypt do wyboru.

 15
Author: Steve Clay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 10:50:36

Podpisane pliki cookie w PHP

Inne odpowiedzi na to pytanie są nieco nieaktualne. PHP 5.2 dodał parametr httponly do funkcji setcookie, skutecznie dodając natywną obsługę podpisanych plików cookie. Zgodnie z funkcją setcookie httponly dokumentacja parametru :

"gdy [ustawione na] TRUE, plik cookie będzie dostępny tylko za pośrednictwem protokołu HTTP. Oznacza to, że plik cookie nie będzie dostępny w językach skryptowych, takich jak JavaScript. Ma sugerowano, że to ustawienie może skutecznie pomóc w ograniczeniu kradzieży tożsamości poprzez ataki XSS (chociaż nie jest obsługiwane przez wszystkie przeglądarki), ale twierdzenie to jest często kwestionowane" {]}

Ustawienie tego parametru na true spowoduje również wyłączenie możliwości edycji tego pliku cookie za pomocą innych narzędzi opartych na przeglądarce, takich jak narzędzia DevTools Chrome. Aby uczynić podpisany plik cookie jeszcze bardziej bezpiecznym, zdecydowanie zalecam zawężenie ścieżki lub domeny, której używa. Możesz określić te za pomocą path i domain parametry. Oczywiście nigdy nie zaszkodzi zabezpieczyć pliku cookie za pomocą parametru secure, jeśli Twoja witryna jest ładowana przez HTTPS. Wynik będzie taki:

setcookie('signedCookie','uneditable value here', 0, '/', 'www.example.com', TRUE , TRUE);

Dlaczego warto używać podpisanych plików cookie?

W rzeczywistości istnieją konkretne sytuacje, w których podpisane pliki cookie są pomocne, podczas gdy inne metody, takie jak sesja, nie są. Załóżmy na przykład, że dana strona internetowa / aplikacja używa load balancer w celu poprawy wydajności. Teraz Załóżmy również, że loads balancer ma wiele fizycznych serwerów, z których serwowane są pliki, a opcja sticky session nie jest dostępna. W takiej sytuacji podpisane pliki cookie są praktycznie jedynym bezpiecznym sposobem zachowania stanu w PHP.

 0
Author: Nadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 09:03:17