Stary wątek, ale wciąż ważny problem. Zauważyłem kilka dobrych odpowiedzi na temat bezpieczeństwa i unikania używania „bezpieczeństwa przez zaciemnienie”, ale rzeczywiste podane metody techniczne nie były wystarczające w moich oczach. Co muszę powiedzieć, zanim przekażę swoją metodę:
- NIGDY nie przechowuj hasła w postaci zwykłego tekstu ... NIGDY!
- NIGDY przechowuj hasła użytkownika w więcej niż jednej lokalizacji w bazie danych. Zaplecze serwera zawsze jest w stanie pobrać zaszyfrowane hasło z tabeli użytkowników. Przechowywanie nadmiarowych danych zamiast dodatkowych transakcji DB nie jest bardziej wydajne, odwrotność jest prawdziwa.
- Twoje identyfikatory sesji powinny być unikalne, aby żaden z dwóch użytkowników nigdy nie mógł udostępnić identyfikatora, stąd cel ID (czy numer identyfikacyjny Twojego prawa jazdy może pasować do innych osób? Nie.) To generuje dwuczęściową unikalną kombinację, opartą na 2 unikalne struny. Tabela Sesji powinna używać identyfikatora jako PK. Aby zezwolić na zaufanie wielu urządzeniom do automatycznego logowania, użyj innej tabeli dla zaufanych urządzeń, która zawiera listę wszystkich sprawdzonych urządzeń (patrz mój przykład poniżej) i jest odwzorowana przy użyciu nazwy użytkownika.
- Nie służy celowi mieszania znanych danych w pliku cookie, plik cookie można skopiować. To, czego szukamy, to zgodne urządzenie użytkownika do dostarczania autentycznych informacji, których nie można uzyskać bez osoby atakującej narażającej komputer użytkownika (ponownie, patrz mój przykład). Oznaczałoby to jednak, że legalny użytkownik, który zabrania statycznym informacjom swojego komputera (tj. Adresowi MAC, nazwie hosta urządzenia, użytkownika użytkownika, jeśli jest ograniczony przez przeglądarkę itp.) Zachowywania spójności (lub fałszowania go w pierwszej kolejności), nie będzie w stanie użyj tej funkcji. Ale jeśli jest to problem, weź pod uwagę fakt, że oferujesz automatyczne logowanie użytkownikom, którzy jednoznacznie się identyfikują, więc jeśli odmówią bycia rozpoznanym przez sfałszowanie swojego MAC, sfałszowanie swojego użytkownika, sfałszowanie / zmianę nazwy hosta, ukrywanie się za serwerami proxy itp., to nie są możliwe do zidentyfikowania i nigdy nie powinny być uwierzytelniane dla usługi automatycznej. Jeśli chcesz, musisz sprawdzić dostęp do kart inteligentnych w pakiecie z oprogramowaniem po stronie klienta, które ustala tożsamość używanego urządzenia.
Biorąc to wszystko pod uwagę, istnieją dwa świetne sposoby automatycznego logowania w systemie.
Po pierwsze, tani, łatwy sposób, który stawia na kogoś innego. Jeśli włączysz obsługę witryny w, powiedzmy, na swoim koncie google +, prawdopodobnie masz usprawniony przycisk google +, który zaloguje użytkownika, jeśli jest już zalogowany w google (zrobiłem to tutaj, aby odpowiedzieć na to pytanie, jak zawsze zalogowany w Google). Jeśli chcesz, aby użytkownik logował się automatycznie, jeśli jest już zalogowany za pomocą zaufanego i obsługiwanego wystawcy uwierzytelnienia i zaznaczył odpowiednie pole, poproś skrypty po stronie klienta o wykonanie kodu za odpowiednim przyciskiem „Zaloguj się za pomocą” przed załadowaniem , pamiętaj tylko, aby serwer przechowywał unikalny identyfikator w tabeli automatycznego logowania, która zawiera nazwę użytkownika, identyfikator sesji i wystawcę uwierzytelnienia użytego dla użytkownika. Ponieważ te metody logowania korzystają z AJAX, i tak czekasz na odpowiedź, i ta odpowiedź jest albo potwierdzoną odpowiedzią, albo odrzuceniem. Jeśli otrzymasz poprawną odpowiedź, użyj jej jak zwykle, a następnie kontynuuj ładowanie zalogowanego użytkownika jak zwykle. W przeciwnym razie logowanie się nie powiedzie, ale nie mów użytkownikowi, po prostu kontynuuj, ponieważ nie jesteś zalogowany, zauważy to. Ma to na celu zapobieżenie, aby osoba atakująca, która ukradła pliki cookie (lub sfałszowała je w celu zwiększenia uprawnień), nie dowiedziała się, że użytkownik automatycznie loguje się na stronie.
Jest to tanie i przez niektórych może być również uważane za brudne, ponieważ próbuje ono zweryfikować potencjalnie już zalogowany użytkownik w miejscach takich jak Google i Facebook, nawet o tym nie mówiąc. Nie należy go jednak stosować u użytkowników, którzy nie poprosili o automatyczne logowanie do witryny, a ta konkretna metoda służy tylko do zewnętrznego uwierzytelnienia, np. Google+ lub FB.
Ponieważ zewnętrzny serwer uwierzytelniający został użyty do poinformowania serwera za kulisami, czy użytkownik został zweryfikowany, osoba atakująca nie może uzyskać niczego poza unikalnym identyfikatorem, który sam w sobie jest bezużyteczny. Opracuję:
- Użytkownik „Joe” odwiedza witrynę po raz pierwszy, identyfikator sesji umieszczany jest w „sesji” pliku cookie.
- Użytkownik „Joe” loguje się, zwiększa uprawnienia, otrzymuje nowy identyfikator sesji i odnawia „sesję” plików cookie.
- Użytkownik „Joe” decyduje się na automatyczne logowanie przy użyciu Google +, otrzymuje unikalny identyfikator umieszczony w pliku cookie „keepmesignedin”.
- Użytkownik „Joe” google utrzymuje ich zalogowanie, umożliwiając Twojej stronie automatyczne logowanie użytkownika przy użyciu Google w backend.
- Atakujący systematycznie próbuje unikatowych identyfikatorów dla „keepmesignedin” (jest to wiedza publiczna przekazywana każdemu użytkownikowi) i nie jest zalogowany nigdzie indziej; próbuje niepowtarzalnego identyfikatora nadanego „joe”.
- Serwer otrzymuje unikalny identyfikator dla „Joe”, pobiera dopasowanie w DB dla konta Google +.
- Serwer wysyła atakującego do strony logowania, która uruchamia żądanie AJAX do Google, aby się zalogować.
- Serwer Google otrzymuje żądanie, używa swojego interfejsu API, aby zobaczyć, że Attacker nie jest aktualnie zalogowany.
- Google wysyła odpowiedź, że nie ma obecnie zalogowanego użytkownika przez to połączenie.
- Strona atakującego otrzymuje odpowiedź, skrypt automatycznie przekierowuje na stronę logowania z wartością POST zakodowaną w adresie URL.
- Strona logowania pobiera wartość POST, wysyła ciasteczko dla „keepmesignedin” na pustą wartość i jest ważne do daty 1-1-1970 w celu powstrzymania automatycznej próby, powodując, że przeglądarka atakującego po prostu usuwa ciasteczko.
- Atakujący otrzymuje normalną stronę logowania po raz pierwszy.
Bez względu na wszystko, nawet jeśli atakujący użyje nieistniejącego identyfikatora, próba nie powiedzie się przy wszystkich próbach, z wyjątkiem przypadków otrzymania poprawnej odpowiedzi.
Tę metodę można i należy stosować w połączeniu z wewnętrznym uwierzytelniaczem w przypadku osób, które logują się do witryny za pomocą zewnętrznego uwierzytelnienia.
=========
Teraz, dla twojego własnego systemu uwierzytelniania, który może automatycznie logować się użytkowników, robię to w ten sposób:
DB ma kilka tabel:
TABLE users:
UID - auto increment, PK
username - varchar(255), unique, indexed, NOT NULL
password_hash - varchar(255), NOT NULL
...
Pamiętaj, że nazwa użytkownika może mieć długość 255 znaków. Mój program serwera ogranicza nazwy użytkowników w moim systemie do 32 znaków, ale zewnętrzni uwierzytelniacze mogą mieć nazwy użytkowników w domenie @ domain.tld mogą być większe, więc po prostu obsługuję maksymalną długość adresu e-mail dla maksymalnej kompatybilności.
TABLE sessions:
session_id - varchar(?), PK
session_token - varchar(?), NOT NULL
session_data - MediumText, NOT NULL
Należy zauważyć, że w tej tabeli nie ma pola użytkownika, ponieważ nazwa użytkownika po zalogowaniu znajduje się w danych sesji, a program nie zezwala na dane zerowe. Identyfikator_sesji i znacznik_sesji można wygenerować za pomocą losowych skrótów md5, skrótów sha1 / 128/256, znaczników datetime z losowymi ciągami dodanymi do nich, a następnie skrótu lub cokolwiek zechcesz, ale entropia danych wyjściowych powinna pozostać tak wysoka, jak to możliwe ogranicz ataki brutalnej siły nawet przed zejściem z ziemi, a wszystkie skróty generowane przez twoją klasę sesji powinny być sprawdzane pod kątem dopasowania w tabeli sesji przed próbą ich dodania.
TABLE autologin:
UID - auto increment, PK
username - varchar(255), NOT NULL, allow duplicates
hostname - varchar(255), NOT NULL, allow duplicates
mac_address - char(23), NOT NULL, unique
token - varchar(?), NOT NULL, allow duplicates
expires - datetime code
Adresy MAC z natury mają być UNIKALNE, dlatego sensowne jest, aby każdy wpis miał unikalną wartość. Z drugiej strony nazwy hostów można legalnie powielać w oddzielnych sieciach. Ile osób używa „Home-PC” jako jednej z nazw swoich komputerów? Nazwa użytkownika jest pobierana z danych sesji przez zaplecze serwera, więc manipulowanie nią jest niemożliwe. Jeśli chodzi o token, ta sama metoda generowania tokenów sesji dla stron powinna być używana do generowania tokenów w plikach cookie dla automatycznego logowania użytkownika. Na koniec dodaje się kod daty i godziny, kiedy użytkownik będzie musiał ponownie zweryfikować swoje poświadczenia. Zaktualizuj tę datę i godzinę przy logowaniu użytkownika, zachowując ją w ciągu kilku dni, lub zmuś ją do wygaśnięcia, niezależnie od ostatniego logowania, zachowując ją tylko przez miesiąc lub więcej, w zależności od projektu.
Zapobiega to systematycznemu fałszowaniu adresu MAC i nazwy hosta dla użytkownika, który zna automatyczne logowanie. NIGDYniech użytkownik zachowa plik cookie z hasłem, czystym tekstem lub w inny sposób. Niech token zostanie zregenerowany na każdej stronie nawigacji, tak jak token sesji. To znacznie zmniejsza prawdopodobieństwo, że osoba atakująca może uzyskać prawidłowy plik cookie tokena i użyć go do zalogowania. Niektóre osoby próbują powiedzieć, że osoba atakująca może ukraść pliki cookie ofiary i przeprowadzić atak polegający na powtórzeniu sesji w celu zalogowania. Gdyby atakujący mógł ukraść pliki cookie (co jest możliwe), z pewnością naraziłby na szwank całe urządzenie, co oznacza, że mógł po prostu użyć urządzenia do zalogowania się, co jest sprzeczne z celem kradzieży plików cookie całkowicie. Tak długo, jak twoja strona działa w oparciu o HTTPS (co powinno mieć miejsce w przypadku haseł, numerów CC lub innych systemów logowania), zapewniasz użytkownikowi pełną ochronę, jaką możesz uzyskać w przeglądarce.
Należy pamiętać o jednej rzeczy: dane sesji nie powinny wygasać, jeśli użyjesz automatycznego logowania. Możesz utracić możliwość fałszywego kontynuowania sesji, ale sprawdzanie poprawności w systemie powinno wznowić dane sesji, jeśli oczekuje się, że będą to trwałe dane między sesjami. Jeśli chcesz mieć zarówno trwałe, jak i nietrwałe dane sesji, użyj innej tabeli dla trwałych danych sesji z nazwą użytkownika jako PK i poproś serwer, aby pobierał je tak, jak normalne dane sesji, po prostu użyj innej zmiennej.
Po uzyskaniu takiego logowania serwer powinien nadal sprawdzać poprawność sesji. Tutaj możesz kodować oczekiwania dotyczące skradzionych lub zainfekowanych systemów; wzorce i inne oczekiwane wyniki logowania do danych sesji często mogą prowadzić do wniosków, że doszło do przejęcia systemu lub fałszowania plików cookie w celu uzyskania dostępu. W tym miejscu ISS Tech może wprowadzić reguły, które uruchomiłyby blokadę konta lub automatyczne usunięcie użytkownika z systemu automatycznego logowania, utrzymując atakujących wystarczająco długo, aby użytkownik mógł określić, w jaki sposób atakujący odniósł sukces i jak je odciąć.
Na zakończenie należy się upewnić, że wszelkie próby odzyskania, zmiany hasła lub niepowodzenia logowania przekraczające próg powodują wyłączenie automatycznego logowania, dopóki użytkownik nie potwierdzi poprawnie i nie potwierdzi tego.
Przepraszam, jeśli ktoś spodziewał się, że w mojej odpowiedzi zostanie podany kod, to się tutaj nie wydarzy. Powiem, że używam PHP, jQuery i AJAX do uruchamiania moich stron i NIGDY nie używam Windowsa jako serwera ... kiedykolwiek.