Aplikacje internetowe

Bełdziowe spojrzenie na aplikacje internetowe

Autologowanie

Wraz z wdrożeniem systemu logowania następuje pytanie czy dać użytkownikom możliwość zautomatyzowania tego procesu, dzięki czemu za każdym razem nie będą musieli podawać swojego loginu i hasła. Głównym przeciwwskazaniem takiej funkcjonalności jest wrażliwość danych jakie są dostępne po zalogowaniu.

Jeśli już zdecydujemy się na udostępnienie takiej funkcjonalności należy rozważyć sposób identyfikowania użytkowników. Najprostszym i dość popularnym sposobem jest zapisanie w ciastku loginu oraz hash’a hasła, na podstawie których będzie odbywało się logowanie przy ponownym wejściu na stronę. Sposób ten ma jedna, spora wadę jeśli ktoś uzyska dostęp do ciastka zalogowanego użytkownika będzie w stanie uzyskać dane potrzebne do „normalnego” zalogowania.

Innym sposobem jest zapisanie w ciastku jedynie identyfikatora użytkownika. Oczywiście identyfikatorem nie może być id pobrany z tabeli z użytkownikami, ponieważ byłby on zbyt prosty do odgadnięcia. Możemy za to użyć jednej z funkcji hashujących. Należy jednak pamiętać, aby nie generować hash’a z ogólnie dostępnych danych oraz odpowiednio go posolić. W przypadku kradzieży ciastka napastnik nadal zyskuje dostęp do konta, jednakże nie uzyskuje danych potrzebnych do „normalnego” logowania.

Dodatkowo należy zapisać czas ważności wygenerowanego hasha. Dzięki temu nawet po kradzieży ciastka napastnik będzie miał dostęp do konta tylko przez ograniczony czas.

Przykładowa tabelka z danymi autologowania może wyglądać następująco:

Field		| Type		| Desc
----------------+---------------+-----------------------------------------------------------
id		| char(32)	| hash md5 identyfikujący usera / zapisany w cookie
user_id		| int		| identyfikator użytkownika / klucz obcy tabeli z użytkownikami
lifetime	| timestamp	| czas życia identyfikatora

Co ważne checkbox umożliwiający automatyczne logowanie powinien być domyślnie odznaczony. Użytkownicy korzystający z serwisu w miejscu publicznym mogą nieumyślnie pozostawić po sobie ciacho dające dostęp do ich konta.

PS. Tworząc ciastko należy dodać mu flagę httpOnly dzięki czemu nie będzie można do niego uzyskać dostępu przy pomocy XSS.


Tagi: ,
Kategoria: Bezpieczeństwo, Logowanie


4 komentarze

  1. Patrząc jako zwykły user, logowanie się za każdym wejściem do serwisu jest dość uciążliwe. Możliwe jest też w tabeli użytkowników dodać jeszcze jedno pole np. cookie_name i wygenerować jakiś id ciastka. może to być md5(id.username), czy jakiś inny string znaków. Przez co nie dorzucamy nowych relacji, a nasza baza była łatwiejsza do obsługi dla Nas.

    pozdrawiam, Wojtek.

  2. pewnie, że można :-) kwestia tylko taka, że ów id nie powinien być id.username ani żadną rzeczą (która jego jest ;-)), która ma jakiś sens – czyli id usera / login etc, ponieważ jeśli wykorzystamy jakąś znaną wartość napastnik będzie mógł bez problemu wygenerować sobie poprawny id sesji :)

  3. Manwe napisał(a):

    jak tutak to tego httpOnly?;> Nie spotkałem się jeszcze z takim taką flagą do ciasteczka :)

    Wg. mnie jest sens tworzenia kolejnej relacji. Tabela opisująca użytkowników powinna zawierać minimum danych możliwych do zalogowania i spersonalizowania użytkownika. Autologowanie nie jest w pewnym sensie własnością opisującą danego użytkownika, lecz metodą z której może skorzystać. I kolejnym za tworzeniem oddzlenej tabeli jest ew atak na tabelę użytkowników. Jak wiecie atak na tabelę jest łatwiejszy niż na całą bazę. Tak więc nawet uzyskanie danych z tabeli użytkowników nie pozwoli na przejęcie (nazwijmy to) sesji autologowania.

  4. co do tabeli, mialem podobne zdanie wyłączając te dane do osobnej tabeli :-) thx za komenta :)

Dodaj komentarz