Pytanie:
Hasła są wysyłane w postaci zwykłego tekstu z powodu błędu użytkownika podczas wpisywania go w polu nazwy użytkownika
Lex
2013-03-05 22:09:55 UTC
view on stackexchange narkive permalink

Po przejrzeniu dzienników generowanych przez różne SIEM (Splunk, HP Logger Trial i SIEM platformy AlienVault) zauważyłem, że z jakiegoś powodu wielu użytkowników popełnia błąd, wpisując swoje hasła w polu nazwy użytkownika, albo w Logowanie do domeny systemu operacyjnego lub w aplikacjach internetowych. Sądzę, że są to ludzie, którzy nie potrafią pisać bez patrzenia na klawiaturę i próbując to zrobić, robiąc to szybko, w końcu wpisują swoje hasła w niewłaściwym polu. Oznacza to, że hasło jest wysyłane w postaci zwykłego tekstu wszędzie w sieci i jest zapisywane w dziennikach ze zdarzeniem, które mówi coś podobnego:

  Użytkownik P @ $$ w0rd nie istnieje [...]  

Lub

  Konto nie może się zalogować: P @ $$ w0rd [...]  

(gdzie P @ $$ w0rd jest rzeczywistym hasłem użytkownika)

Staje się dość oczywiste, aby ustalić, do kogo należą hasła: zwykle poprzednie lub bardzo następne (nie) udane wydarzenie w ten sam plik dziennika poinformuje Cię o zdarzeniu wywołanym przez tego samego użytkownika.

Każdy inny analityk, patrząc na dzienniki, mógłby uzyskać czyjeś poświadczenia, nawet jeśli właściwy właściciel nie byłby tego świadomy; najgorszym scenariuszem jest podsłuchiwanie sieci lub rzeczywiste przejęcie pliku dziennika.

Szukam ogólnych wskazówek, jak temu zapobiec. Zakładam, że zwykłe maskowanie nazwy użytkownika jest niewykonalne, a nawet gdyby tak było, prawdopodobnie wyeliminowałoby to dużą część analizy dziennika, ponieważ nie można stwierdzić, kto co zrobił.

Uwaga: b > Istnieje już post dotyczący podobnego problemu, ale próbuję znaleźć sposób, aby temu zapobiec. Jakie jest ryzyko, jeśli przypadkowo wpiszę hasło w polu nazwy użytkownika (logowanie do systemu Windows)?


Zaakceptowana odpowiedź: chciałbym wybrać kilka odpowiedzi z listy. Niestety muszę trzymać się tylko jednego na forum, ale w praktyce mogę je połączyć. Bardzo dziękuję za wszystkie odpowiedzi; Widzę, że nie ma jednego rozwiązania. Ponieważ zgadzam się, że dodanie „rzeczy” zwiększa złożoność, która zwiększa prawdopodobieństwo wystąpienia luk w zabezpieczeniach, muszę zgodzić się z większością wyborców, że @AJHenderson ma najbardziej elegancką i najprostszą odpowiedź jako pierwsze podejście. Zdecydowanie SSL i prosta weryfikacja kodu na serwerze lub nawet po stronie klienta. Ponieważ szukam sposobu na złagodzenie działań nie przeciwko złośliwym użytkownikom, ale rozproszonym, to wystarczy. Gdy to nastąpi, możemy zacząć rozważać rozszerzenie implementacji na niepotrzebnych użytkowników, jeśli jest to konieczne. Jeszcze raz bardzo dziękuję za wkład wszystkich.

Skasuj nazwę użytkownika i hasło i prześlij dalej. Oczywiście tworzenie konta musi odbywać się przy użyciu protokołu HTTPS. Dalsze logowanie nie jest konieczne.
@SparKot ॐ - problem polega na tym, że jeśli zaszyfrujesz nazwę użytkownika bez zwykłej soli, niezmiernie trudno jest zidentyfikować użytkownika. Dzięki wspólnemu rozwiązaniu nazwy użytkownika możliwe staje się wykonanie ataku tęczowej tablicy na dzienniki w celu znalezienia błędnie wprowadzonych haseł.
Rainbow table jako analityk siem z logami aplikacji i innymi liczącymi ponad 5000+ eps brzmi bardzo niewygodnie. Istnieją rozwiązania Siemens, takie jak Q1, które ostrzegają o wyrażeniu regularnym zdefiniowanym w celu sprawdzania typów nazw użytkowników.
@Lex Jestem zdezorientowany, jakie jest ryzyko, że ktoś w ten sposób węszy hasło z drutu? Jak duże zagrożenie to oznacza? Jeśli mam coś takiego jak sslstrip, to pokonuje wszystkie zabezpieczenia na kablu.
Logować tylko wtedy, gdy nazwa użytkownika istnieje w bazie danych?
@asadz zagrożenie wydaje mi się dość duże, ponieważ hasło może być przesyłane w postaci zwykłego tekstu z nazwy użytkownika zapisanej tak, jakby to była nazwa użytkownika. Prawdopodobieństwo może być minimalne, jednak najbardziej przeraża mnie prawdopodobieństwo oszustwa wewnętrznego ze strony kogoś, kto nadużywa uprawnień do przeglądania dziennika zapisanego w postaci zwykłego tekstu.
@Lex, ale byłoby to kolejne ryzyko - wszystko razem zapisane w postaci czystego tekstu na maszynie, odnosiłem się do ryzyka wywąchania z drutu. W takim przypadku napastnik musi mieć duże szczęście. W zależności od odpowiedzi systemu (jeśli zażąda jednorazowego tokena / hasła) lub w jakiś sposób pre-autoryzacji, szansa na włamanie jest znacznie mniejsza.
@asadz Zgadzam się w 100%
@CodesInChaos to ciekawy pomysł i jestem pewien, że można do tego zaimplementować filtr regex.
Ci z nas, którzy potrafią pisać bez patrzenia na klawiaturę, również mogą popełnić ten błąd. Zwykle nie musimy też patrzeć na ekran, a jeśli ktoś jest nieco rozproszony, taki błąd jest łatwy do popełnienia. Jest to zaleta wersji Windows XP Home Edition i późniejszych interfejsów, w których jest to menu użytkowników do wyboru. Oczywiście nieprzydatne w przypadku większej liczby użytkowników.
Zdarzało mi się to cały czas z następującego powodu: zazwyczaj, kiedy odblokowuję komputer, pamięta, że ​​byłem ostatnim użytkownikiem i wystarczy wpisać hasło. Często używam `[ctrl] - [alt] - [del]` i wpisuję hasło przed przywróceniem zasilania monitora. Jeśli jednak ostatni raz logowałem się za pośrednictwem zdalnego pulpitu, nazwa użytkownika zostanie wyczyszczona. Postępowanie zgodnie z moją rutynową procedurą w tym scenariuszu skutkuje wprowadzeniem hasła jako nazwy użytkownika.
Wpisanie hasła w coś innego niż pole do wprowadzania hasła jest prawdopodobnie główną przyczyną zmiany hasła. Powinienem chyba częściej popełniać ten błąd!
Mam dwie maszyny i jedną klawiaturę. Korzystanie z Myszki bez obramowań Czasami wpisuję hasło, gdy myślę, że kursor jest ustawiony. Nie zawsze to pole, które wymaga logowania
Nagle czuję potrzebę zmiany różnych haseł ... Poza tym, kiedy robiłem to w przeszłości, często zdarza się, że piszę bardzo szybko i przypadkowo pomijam klawisz „tab”, aby przejść do następnego pola. Innymi słowy ... Nie udało się zalogować konta: MikeSP @ $$ W0RD
Zauważyłem naprawdę irytujący błąd polegający na tym, że na stronie internetowej przełączam się na pole hasła i zaczynam pisać przed zakończeniem ładowania strony, a gdy strona się skończy (w trakcie wpisywania hasła) oderwie fokus od pole hasła i powrót do wartości domyślnych (zwykle jest to pole nazwy użytkownika). Chciałbym, żeby wszyscy upewnili się, że ich produkt / strona internetowa tego nie robi.
Jeśli to możliwe, czy możesz dodać nowe pole, na przykład ponownie wprowadzić hasło i dodać weryfikację po stronie klienta?
@Lex "... z jakiegoś powodu ..." Tylko spekuluję na temat powodu: czy na stronie znajduje się skrypt javascript, który po załadowaniu strony ustawia fokus na polu nazwy użytkownika? Robi to moja witryna bankowa i znalazłem się w polu nazwy użytkownika, wpisując pw z powodu asynchronicznego obciążenia. (np. wpisałem swoją nazwę użytkownika i podczas pisania - lub tuż przed pisaniem - mój pw, strona w pełni się załaduje, ustawię fokus na nazwę użytkownika, a mój pw pojawi się w polu nazwy użytkownika).
@Sufyan - tak, to również byłoby skuteczne, ale byłoby to uderzeniem w użyteczność, ponieważ wymaga dodatkowej pracy ze strony użytkownika, co generalnie spowoduje, że zostanie źle odebrany. Nie mówiąc, że w niektórych sytuacjach nie byłby to właściwy wybór, ale nie byłby to popularny wybór.
-> Użytkownik P @ $$ w0rd nie ** kończy ** jest oczywistą literówką.
[Przepraszamy, jeśli ktoś już to skomentował] Tego rodzaju rzeczy zdarzają się znacznie częściej teraz, gdy tak wiele osób używa takich rzeczy jak KeePass do automatycznego wpisywania swoich danych uwierzytelniających. Bardzo łatwo jest ustawić fokus w niewłaściwym polu, a następnie automatycznie wpisana nazwa, karta, hasło, sekwencja wprowadzania wypełnia niewłaściwe pola.
@ray023 Nie mogę ci tego powiedzieć, obawiam się. Jednak zdarza się to również osobom popełniającym błędy przy logowaniu do systemu Windows.
Ostatnio miałem coś podobnego, gdy użytkownik umieścił `Authorization Basic ` w samym adresie URL (parametr zapytania) zamiast w nagłówku HTTP ... przepraszam za niego, ale jego żądanie trafiło do pliku "NCSA-logs" inie możemy po prostu zapobiec rejestrowaniu tego, ponieważ nie analizujemy komunikatu dziennika przed jego zarejestrowaniem.
Siedemnaście odpowiedzi:
AJ Henderson
2013-03-05 23:33:26 UTC
view on stackexchange narkive permalink

Jedną z myśli jest niedozwolone przesyłanie formularzy, jeśli w polu hasła nie ma wartości. Ogólnie rzecz biorąc, jeśli przypadkowo wpisali hasło w nazwie użytkownika, prawdopodobnie nie będzie niczego w oknie dialogowym hasła.

Warto zauważyć, że nie trzeba tego po prostu zrobić po stronie klienta, ale można również wykonać na serwerze, o ile używany transport jest bezpieczny, a dane wejściowe są rejestrowane dopiero po przejściu sprawdzenia, czy pole hasła nie jest puste.

Prosty, ale elegancki. Chciałbym móc dać mu +5.
W rzeczy samej. Jeśli spróbujemy połączyć to z jakimś podstawowym filtrem poziomu, jak sugeruje @CodesInChaos. +1
Ominięta kontrola javascript wysłałaby nazwę użytkownika przez sieć, do której odnosi się ryzyko. Zostałby wybrany przez coś podobnego do wireshark i gdyby jego ssl nadal byłby to np. Sslstrip http://www.thoughtcrime.org/software/sslstrip/
szkoda, że ​​nie możemy przekonać MS do zaimplementowania tego w oknie dialogowym logowania do systemu Windows.
@asadz - tak, to nie jest ochrona przed zrobieniem czegoś przez napastnika, pytanie dotyczyło tylko tego, co można zrobić, aby hasła nie trafiały do ​​plików dziennika przez użytkowników popełniających błędy.
Czy można to zagwarantować bez elementów sterujących JavaScript w nowoczesnych przeglądarkach? Czy przed HTML5 jest wymagany element formularza (http://john.foliot.ca/required-inputs/)
@DanNeely Ale okno logowania do systemu Windows może mieć hasło o zerowej długości. A więc tego rozwiązania nie da się tam wdrożyć, prawda?
@EricG: Biorąc pod uwagę, że * głównym * problemem OP są dzienniki serwera, a nie podsłuch sieciowy, logika może zostać zduplikowana po stronie serwera przed umieszczeniem nazwy użytkownika w komunikacie dziennika.
@ruakh: To dobra uwaga, ale nie o tym mówi odpowiedź, mówi ona o zapobieganiu przesyłaniu formularzy, a nie rejestrowaniu, co jest sugerowane w kilku innych odpowiedziach.
@EricG: Tak, zgadzam się. W dużej mierze celem komentarzy jest pomoc w ulepszaniu odpowiedzi, więc sugerowałem coś, co moim zdaniem pomoże rozwiązać problem z tą odpowiedzią.
@AnuragKalia, więc włącz ją tylko w przypadku, gdy obowiązuje polityka dotycząca haseł.
@AJ Henderson popularny wkład :).
Zgadzam się - fajna, szybka i łatwa wygrana po stronie klienta.
Czy ktoś ma konkretny sposób, aby to zrobić, czy też polegamy tylko na JavaScript? Jeśli tak, czy powinniśmy rozszerzyć tę odpowiedź o jakieś szczegóły?
@EricG - zaktualizowałem odpowiedź, aby odzwierciedlić, że można to również zrobić po stronie serwera. Chociaż Form jest kluczowym słowem do postu HTML, nigdy nie było zamierzoną implikacją mojej odpowiedzi. Chodzi o to, aby nie przetwarzać próby logowania, dopóki pole hasła nie będzie miało wartości. Może to być na serwerze lub kliencie.
@Iszi * Możesz * dać mu +5, upuszczając nagrodę.
@AJHenderson: Zakładam, że Twoje dzienniki serwera internetowego lub dzienniki ruchu sieciowego mogą zawierać hasło. Można zatrzymać przetwarzanie przed utworzeniem jakichkolwiek dzienników na poziomie aplikacji. Potrzebowałbyś filtrów w swoim dzienniku internetowym / sieciowym.
@EricG - jeśli rejestrujesz dane każdego wpisu na forum, będzie to dużo rejestrowania. Przypuszczam, że nadal musiałbyś uważać na to, jak konfigurujesz, ale myślę, że prawdopodobnie możesz obejść rejestrację, o ile faktycznie nie spróbuje uwierzytelnienia. To prawda, może nie działać we wszystkich systemach.
Piękne rozwiązanie, dzięki za tę sugestię! Wszystkie okna dialogowe logowania powinny to implementować. Zacznę od zaimplementowania go w jednej z moich aplikacji.
fixulate
2013-03-05 22:13:39 UTC
view on stackexchange narkive permalink

Zakładając, że Twoja aplikacja zaplecza i SIEM muszą wyświetlić nieudane próby logowania do różnych aplikacji (i w ten sposób wyświetlić komunikat o błędzie „Użytkownik P @ $$ w0rd jest nieprawidłowy”), zatrzymanie tego nie będzie trywialne.

Jednak upewnienie się, że wszystkie aplikacje wysyłające poufne dane, w tym nazwy użytkowników i hasła, obsługują HTTPS (szyfrowany HTTP przy użyciu SSL), jest dobrym sposobem na zapewnienie, że urządzenia sieciowe i nikt w sieci nie może uzyskać hasła, które zostało omyłkowo wprowadzone w polu nazwy użytkownika!

W rzeczy samej. to rozwiązałoby połowę moich problemów / obaw. +1. Dziękuję bardzo.
Wydaje mi się, że ssl to obejście, a nie poprawka kodu. W najlepszym przypadku problemy powinny być rozwiązywane u źródła.
@asadz: Fakt, że aplikacja wyświetla nazwę użytkownika, gdy zostanie wprowadzona niepoprawnie, nie jest błędem aplikacji, jest zamierzoną funkcjonalnością i nie wymaga naprawy imo.
@devcity2012 Prawdopodobnie zamierzona funkcjonalność, ale słabo o niej pomyślana; część analizy wymagań w inżynierii oprogramowania; to jest miejsce, w którym te rzeczy powinny być trudne, najlepiej przy użyciu diagramu sekwencji; dlaczego nie ma sprawdzania formularza przed wysłaniem? Czy walidacja danych wejściowych jest nieważna?
Jeśli formularz przyjmuje nazwę użytkownika i hasło i oba są obecne, a następnie zaplecze jest skonfigurowane do wyświetlania nazwy użytkownika, nie jest to błąd aplikacji, jeśli użytkownik omyłkowo wprowadzi swoje hasło w polu tekstowym nazwy użytkownika.
Mówię o tym jako o problemie tylko w tym sensie, że żądanie byłoby przesłane tylko na podstawie pola nazwy użytkownika?
Jasne, więc można to powstrzymać, tak. :)
goodguys_activate
2013-03-05 23:43:00 UTC
view on stackexchange narkive permalink

Więc problem polega na tym, że nie chcesz, aby analitycy widzieli hasła w poufnych plikach dziennika?

Uwaga: nawet jeśli używałbyś Javascript, nie zajmuje się on danymi haseł przechowywanymi na dysku w postaci zwykłego tekstu.

Lepszym rozwiązaniem jest wstępne przetwarzanie dzienników, zanim analitycy je zobaczą, i zredagowanie informacji w dziennikach.

Możesz wykonać to filtrowanie linia po linii, jeśli umieszczasz na białej liście lub czarnej liście inne linie. Na przykład:

Możesz umieścić na białej liście nazwy użytkowników, które pojawiają się w pliku dziennika, które

  • mają wzorzec ([az] + numer) lub ([az] + kropka + [az])
  • dołącz nazwę domeny, po której następuje ukośnik „\” dla środowisk AD.
  • pojawia się wiele razy
  • Może być czyszczone z katalogiem LDAP zawierającym znane nazwy użytkowników, zanim analitycy go zobaczą.

Identyfikujesz i umieszczasz na czarnej liście hasła poprzez:

  • Zasady dotyczące haseł często są zgodne z wzorcem (jeden symbol, górne / dolne, x znaków ...)

Możesz wykorzystać tę wiedzę do stworzenia niestandardowego narzędzia do czyszczenia danych dziennika, aby chronić informacje, których nie podałeś nie chcę, aby analitycy widzieli.

Jak więc wygląda przefiltrowana linia?

Możesz po prostu redagować wątpliwe nazwy użytkowników, haszując je, przypisując im ludzki identyfikator i przechowując je w bezpieczna lokalizacja:

  eb574b236133e60c989c6f472f07827b Redact1 7e67b89a695bfbffc05b7ed2c38f927f Redact2 ..etc  

Analitycy mogą sprawdzić, czy dany wpis powtarza się w kółko, jeśli częstotliwości.

Dokładna metoda mieszania (lub metoda szyfrowania), którą wybierzesz, wiąże się z ryzykiem, ponieważ ta „baza danych skrótów” będzie zawierała informacje o dużej wartości. A seeding (ze swej natury) zapobiegnie analizie częstotliwości, która może być dla Ciebie wartościowa lub nie.

+1 Dobrze jest zawsze zakładać, że dzienniki zawierają poufne informacje, chyba że zostanie to wyraźnie zredagowane lub dopóki nie zostanie udowodnione, że jest inaczej.
Nathan Goings
2013-03-06 07:13:02 UTC
view on stackexchange narkive permalink

Mogę zidentyfikować tylko trzy problemy z tym, o czym rozmawiasz.

  1. Użytkownicy nie wprowadzają poprawnie informacji.
  2. Analitycy mogą odróżniać hasła w dziennikach.
  3. Hasła są wysyłane w postaci zwykłego tekstu i są podatne na podsłuchiwanie przez man-in-the-middle .

Moim zdaniem jest to dość proste do naprawienia.

  1. Akceptuj błąd użytkownika, nieumyślnie.
  2. Nie rejestruj nieprawidłowych nazw użytkowników, zamiast tego rejestruj nieudane próby i adres IP.
  3. Nie wysyłaj nazw użytkowników zwykłym tekstem. Użyj technologii takiej jak HTTPS lub użyj javascript do zakodowania zwykłego tekstu (np. ROT13).

Przykładowy dziennik nieudanego logowania, a następnie udanej ponownej próby.

  [00:00:00] Logowanie nie powiodło się z 192.168.1.100 [00:21:00] Pomyślne logowanie „root” z 192.168.1.100  

Czytając inne odpowiedzi, chciałbym to załączyć.

  • Sprawdź poprawność wszystkich pól przed przesłaniem.
  • Rozważ podzielenie formularza na wiele stron, ponieważ Eric Wspomniał G.
Nie jestem pewien, co dokładnie masz na myśli, mówiąc „skręć własne w javascript”, ale jestem prawie pewien, że to zły pomysł.
-1 nigdy nie umieszczaj własnego https w javascript. Jeśli nie to miałeś na myśli, wyjaśnij.
@makerofthings7 wyjaśniłem. Nigdy nie powiedziałem roll https w javascript, powiedziałem OR javascript (wyjaśnione przez szyfrowanie). Chociaż nie jest to najłatwiejsze do wdrożenia * poprawnie *, istnieją zasoby dla tego rodzaju rozwiązania. To ważna odpowiedź i nie rozumiem, dlaczego jest warta negatywnego punktu.
Javascript z kodem kryptograficznym dostarczonym z serwera (co zdaje się opisywać) rzadko jest dobrym pomysłem. Serwer może modyfikować ten kod JS i ujawniać lokalne klucze prywatne. Kolejnym wektorem jest XSS / CSRF. To ryzykowny projekt bezpieczeństwa. HTTPS powinien być minimum. Daj mi znać, jeśli myślisz o innym wdrożeniu, takim jak aplikacja HTML / SPA opakowana w PhoneGap lub coś podobnego.
@makerofthings7, Mój proces myślowy nie dotyczył pośrednika. To jest puszka robaków. Wyobrażałem sobie podsłuchiwanie. Jeden z systemów, nad którym pracowałem, zakodował wszystkie dane formularzy za pomocą javascript (z losowym kluczem), aby współpracownicy nie mogli się nawzajem podsłuchiwać.
Eric G
2013-03-06 01:49:18 UTC
view on stackexchange narkive permalink

Rozwiązaniem, które widziałem kilka banków, które wdrożyło, przynajmniej w aplikacjach internetowych, jest dwustronicowe logowanie.

  1. Na pierwszej stronie zaakceptuj tylko nazwę użytkownika
  2. Na następnej stronie w procesie poproś o hasło i powtórz tylko echo nazwy użytkownika, aby nie było to pole do edycji

Dlatego jedynym wpisem na drugiej stronie powinno być hasło. Ponieważ użytkownik wie, że musi wyczyścić pierwszą stronę nazwą użytkownika, wie, że musi wyczyścić tę bramę, wtedy jedyną opcją na drugiej stronie jest hasło.

Jeśli możesz zaimplementować ten przepływ pracy, pomoże on użytkownikom skoncentrować się na tym, co i kiedy piszą.


Biorąc pod uwagę logowanie: Może możesz zmienić sposób logowania nie uwzględniać rzeczywistych danych logowania?

Np. po pomyślnym zalogowaniu użyj identyfikatora klucza podstawowego zamiast powtarzania odpowiedzi: „Użytkownik o identyfikatorze: '2342342' próbował się zalogować”, a następnie „Użytkownik o identyfikatorze '2342342' pomyślnie podano hasło ”.

Jeśli wyszukujesz i nie ma tam nazwy użytkownika, to coś w rodzaju „Użytkownik z adresu IP '192.168.0.10' próbował zalogować się z nieprawidłowym identyfikatorem użytkownika”.

To byłyby dzienniki poziomu Twojej aplikacji. Dzienniki serwera WWW mogą zawierać parametry zapytań, więc może to być trochę trudniejsze do zaadresowania, albo może można umieścić jakiś rodzaj filtru proxy pomiędzy akcją a zapisem dziennika w celu redagowania zawartości dziennika na podstawie określonych reguł. Byłoby to zależne od platformy, ale wygląda na to, że jest to możliwe na Apache.

Jako dodatkowy element sterujący ogranicz dostęp do odczytu różnych przetwarzanych plików dziennika.

uwierzytelnianie seryjne? być może
Formularze dwuetapowe to właściwie jedyne miejsce, do którego najprawdopodobniej się potknę i wyrzucę hasło w polu nazwy użytkownika na pierwszej stronie!
Chciałbym dowiedzieć się więcej o przypadku UX, czy masz jakiś powód, dla którego myślisz, że tak się dzieje? Czy logowanie do witryny przechowuje Twoją nazwę użytkownika przy kolejnych wizytach, czy nie? Wyobrażam sobie, że to pomogłoby (ale mogłoby zaszkodzić), ponieważ nie miałbyś nawet pola do wpisania, gdyby wstępnie wypełniło twoją nazwę użytkownika. Daj mi znać więcej szczegółów, a zobaczę, czy mogę dodać dodatkowe informacje do mojej odpowiedzi.
To sprawia, że ​​jestem znacznie mniej sfrustrowany, że robi to jeden z moich banków, dzięki za tę odpowiedź (hah).
Abhijit
2013-03-06 01:23:39 UTC
view on stackexchange narkive permalink

Ogólnie rzecz biorąc, cały kod klienta jest wystarczająco inteligentny, aby poradzić sobie z podstawowymi błędami

  1. Brak identyfikatora użytkownika lub hasła
  2. Hasło niezgodne z wytycznymi
  3. ol>

    W każdym razie, gdy nadal widzisz te wpisy w dzienniku,

      Użytkownik P @ $$ w0rd nie wychodzi [...] Konto nie zostało zalogowane: P @ $$ w0rd [...]  

    Żadna z walidacji klienta nie zadziałała i system wysłał niezaszyfrowane hasło przez sieć. Więc co było w polu hasła? Zdecydowanie nie jest puste, ponieważ weryfikacja klienta zakończy się niepowodzeniem. Musi być coś innego niż hasło.

    Więc niech to będzie uwierzytelnianie dwuprzebiegowe

    1. First Pass, wyślij wszystkie zaszyfrowane dane, w tym hasło, do serwera. Sprawdź, czy pole Hasło jest puste.
    2. Pierwsze przejście, sprawdź, czy hasło jest zgodne z wytycznymi w przeciwnym razie Błąd.
    3. Pierwsze przejście, następnie sprawdź, czy hasło jest obecne w Twojej bazie danych. Jeśli nie wystąpił błąd.
    4. Odeślij odpowiedź RPC do klienta i pozwól mu wysłać teraz identyfikator użytkownika i hasło.
    5. Teraz przeprowadź proces uwierzytelniania.
    6. ol >

      Cała istotą tego procesu jest

      1. Minimalizacja ryzyka. Uwaga, nie możesz wyeliminować ryzyka zerowego.
      2. Brak zaufania do klienta.

      I na koniec poproś eksperta UX o sprawdzenie interfejsu. Możliwe, że twój interfejs ma jakąś wadę, która powoduje, że Użytkownicy wpisują Hasło w polu ID.

Doskonała sugestia. Myślę, że większość dotychczasowych odpowiedzi zawiera dobre podsumowanie i to wszystko ma sens. +1
Kevin Reid
2013-03-06 10:06:44 UTC
view on stackexchange narkive permalink

Z tego, co opisujesz swoją architekturę, jest to niewykonalne, ale moim zdaniem poprawnym rozwiązaniem jest: Nie wysyłaj nazwy użytkownika w sposób jawny i nie rejestruj nazw użytkowników w przypadku nieudanych prób logowania. Jedynym miejscem, w którym powinna się znajdować nazwa użytkownika i hasło, jest podsystem sprawdzający hasło; dopóki to nie nastąpi, nazwa użytkownika jest nieuwierzytelnionymi, dowolnymi danymi - każdy, kto ma dostęp do formularza logowania, którym w aplikacji internetowej jest cały Internet, może wpisać wszystko, co chce, tak często, jak chce - i dlatego mówi bardzo mało interesującego. (Chyba że twój formularz logowania nie jest dostępny w Internecie.)

prawdopodobnie wyeliminowałoby to wiele analizy dziennika, ponieważ nie można było stwierdzić, kto co zrobił ....?

Biorąc pod uwagę nazwę użytkownika bez prawidłowego hasła, nie wiesz, że żądanie faktycznie pochodzi od tego użytkownika , więc nadal nie wiesz, kto wykonał próbę logowania.

-1
nalply
2013-03-06 17:24:05 UTC
view on stackexchange narkive permalink

Ogólnym problemem jest uwierzytelnianie za pomocą hasła. Każdy sklep typu mama i pop nalega na posiadanie własnego uwierzytelniania za pomocą haseł. To głupie.

Pozwól innemu dostawcy tożsamości wykonać ciężką pracę, aby zapewnić bezpieczeństwo poświadczeń. Zrób to samo, co robi StackOverflow: zezwól na uwierzytelnianie za pomocą OpenID, Gmaila itp.

Twoi użytkownicy będą Ci wdzięczni, że nie potrzebujesz gdzieś kolejnego hasła.

dr jimbob
2013-03-06 04:29:30 UTC
view on stackexchange narkive permalink

JavaScript po stronie klienta wydaje się rozsądny.

Sprawdź, czy pole hasła nie jest puste przed przesłaniem. Sprawdź, czy nazwa użytkownika ma prawidłową formę. Szczególnie eleganckie jest coś, w którym nazwa użytkownika musi być adresem e-mail. Możesz dodatkowo zabronić umieszczania hasła w mechanizmie ustawiania / zmiany hasła w postaci adresu e-mail. Następnie przed wysłaniem formularza po prostu sprawdź, czy nazwa użytkownika ma postać prawidłowego adresu e-mail. Można to zrobić podobnie za pomocą, powiedzmy, znaków specjalnych lub liczb. (Np. Cyfry / znaki specjalne są wymagane w hasłach, ale zabronione w nazwach użytkowników).

Dodatkowo używaj aktualnej biblioteki SSL dla wszystkich wysyłanych formularzy (należy to zrobić, aby uniemożliwić podsłuchiwanie podsłuchów sieciowych w). Wymagaj podwyższonych uprawnień do odczytu tych dzienników (np. Konto serwera WWW może zapisywać w tych dziennikach, ale tylko root może je odczytać). Gdy tylko hasło nie przejdzie kroku uwierzytelniania, nie propaguj nazwy użytkownika do innych systemów. (Używaj również SSL między różnymi systemami wewnętrznymi, aby zapobiec podsłuchiwaniu sieci).

Daniel Pryden
2013-03-06 09:53:14 UTC
view on stackexchange narkive permalink

Podoba mi się podejście, które moja obecna firma stosuje do tego problemu: jeśli wpiszesz hasło w niewłaściwym polu, zautomatyzowany system spowoduje natychmiastowe wygaśnięcie hasła. Dlatego użytkownik musi zmienić swoje hasło, a hasło, które jest w dzienniku, nie jest już podatne na ataki.

Oczywiście nadal nie jest to idealne rozwiązanie, jeśli użytkownik nadal używa tego hasła do innego systemu, ale miejmy nadzieję, że zmuszenie użytkownika do zmiany hasła sprawi, że użytkownik będzie bardziej świadomy możliwych zagrożeń bezpieczeństwa.

Jak to działa? Czy sprawdza, czy „nazwa użytkownika” jest porównywana z „hasłem” przechowywanym w bazie danych, jeśli są zgodne, wymusza resetowanie? Czy jest to oparte na sieci WWW, czy też na poziomie Windows / LDAP? Jeśli tak, czy jest to produkt niestandardowy czy z półki?
@EricG: To system niestandardowy i nie zbudowałem go, więc tak naprawdę nie wiem, jak został zaimplementowany. To powiedziawszy, uważam, że działa to poprzez haszowanie nazwy użytkownika i sprawdzanie skrótów z hasłami hasła. Rozumiem, że przechowują gdzieś bazę danych „haseł znalezionych w podejrzanych okolicznościach” i wygasają wszystkie aktywne hasła pasujące do tej listy.
Myślę, że przegapiłeś część, w której pytał, skąd wiedzą, że hasło zostało wprowadzone w polu nazwy.
@jcolebrand: Przepraszam, myślałem, że wyjaśniłem, że: haszuj wszystko, co zostanie wprowadzone w polu nazwy użytkownika i sprawdź hash w bazie danych haseł. Opcjonalnie użyj czegoś takiego jak filtr Bloom, jeśli masz naprawdę dużą bazę danych haseł i chcesz szybko sprawdzić. Nie mam jednak pojęcia, czy tak właśnie robią: może jest jeszcze lepszy sposób.
To może być rzeczywiście ważne. Wtedy problem polega na tym, że mogę wpisać 1234567 lub password1 itp. I unieważnić całą masę haseł. Jeśli wydaje mi się, że znam hasło moich znajomych itp.
Jestem z EricG. Nie rozumiem, jak właściwie to zaimplementować w bezpieczny sposób. Jeśli baza danych haseł przechowuje hasła za pomocą soli (i używa powolnego skrótu hasła, takiego jak bcrypt), nie jest łatwo zweryfikować, czy niepoprawna nazwa użytkownika jest w rzeczywistości czyimś hasłem, a jeśli tak, znajdź, kto to był - najlepiej, co możesz zrobić to wyczerpujące wyszukiwanie wśród wszystkich użytkowników w bazie danych, które nie jest skalowalne. Jeśli baza danych haseł nie używa soli (lub nie używa powolnego skrótu hasła), masz poważniejsze problemy - to zdecydowanie nie, nie.
Izac Mac
2013-03-06 21:18:47 UTC
view on stackexchange narkive permalink

Przeważnie NAJŁATWIEJSZA odpowiedź jest poprawna. Teraz zauważamy, że każdy adres e-mail ma znak „@” tuż przed nazwą domeny. Uczynienie „@” kluczem NIEAKCEPTOWALNYM w haśle sprawia, że ​​rozwiązanie jest dość oczywiste. Jeśli nazwa użytkownika NIE ma @, a WSZYSTKIE NAZWY UŻYTKOWNIKÓW są adresami e-mail, wtedy Loguj tylko te, które mają co najmniej @.

Teraz, jeśli nazwa użytkownika NIE MA „@”, prawdopodobnie może to rozzłościć niektórych użytkowników, ale to jest zgrabne rozwiązanie. To znaczy mieć JEDEN POJEDYNCZY znak specjalny, który pojawia się PRZED hasłem. Podobnie jak WSZYSTKIE NAZWY UŻYTKOWNIKÓW, które są kontami e-mail, mają format. Wszystkie odpowiedzi mają specjalny charakter na początku lub na końcu. Więc kiedy użytkownik wprowadza hasło, dajesz mu znać, że musi je wpisać.

Trzecim rozwiązaniem jest KODOWANIE KOLORÓW. Zmień pole nazwy użytkownika na żółte i pole hasła na CZERWONE. Czerwony zwykle przyciąga twoją uwagę, ponieważ jest używany do delikatnych rzeczy. Więc nawet jeśli patrzą na klawiaturę, BARDZO SZYBKO DOWIEDZ SIĘ, że hasła są czerwone, więc zasadniczo pole tekstowe ORAZ etykieta hasła są czerwone, najlepiej w oddzielnym polu, a etykieta nazwy użytkownika i pole tekstowe CAŁKOWITE ŻÓŁTE.

Używanie adresów e-mail jako nazw użytkowników nie jest uniwersalne w przypadku aplikacji publicznych i jest rzadkością w aplikacjach wewnętrznych. Kodowanie kolorami raczej nie pomoże: typowym powodem użycia niewłaściwego pola jest nieuwaga na to, które pole jest skupione (zwłaszcza gdy pole nazwy użytkownika jest zwykle wstępnie wypełnione, ale z jakiegoś powodu nie jest w jednym przypadku).
l--''''''---------''''''''''''
2013-03-06 02:01:05 UTC
view on stackexchange narkive permalink

Dlaczego po prostu nie odpowiedzieć?

  Ta nazwa użytkownika nie istnieje  
Prawdopodobnie nie powinieneś tego robić, a nawet poświęcić trochę czasu na odpowiedź. Odpowiedzi takie jak ta, a czasami różnica w czasie potrzebnym do przetworzenia może zostać nadużyta, należy podać listę prawidłowych nazw użytkowników, których można by użyć nawet w celach innych niż próba uzyskania dostępu do samej witryny / usługi (np. spróbuj wysłać e-mail do tej samej nazwy użytkownika w Gmailu itp.).
@GaryS.Weaver: <- Tak. np. tworzysz test A / B w swoim brutalnym forcerze i za każdym razem, gdy masz inne warunki, wiesz, że zidentyfikowałeś prawidłową nazwę użytkownika.
@GaryS. Weaver nie ma niezawodnego rozwiązania, ale nie sądzisz, że to trochę przesada? nie prowadzi americanexpress.com
@ Артём-Царионов to do Ciebie, jego i wszystkich innych należy wdrożenie zabezpieczeń według własnego uznania.
Problem w pytaniu polega na tym, że nazwa użytkownika kończy się w plikach dziennika, które trwale zapisują nazwę użytkownika w postaci zwykłego tekstu. Jeśli kiedykolwiek włamano się na serwer lub administrator nie był uczciwy, mógł uzyskać dostęp do konta użytkownika bez żadnych wpisów w systemie. Plik dziennika nadal musi wiedzieć, jakie nazwy użytkowników są próbowane, więc rozwiązanie musiałoby w jakiś sposób zapobiec przechowywaniu hasła w dzienniku, jeśli zostanie umieszczone w polu nazwy użytkownika.
@AJHenderson dziękuję! na początku nie rozumiałem
A. Wilson
2013-03-06 06:48:39 UTC
view on stackexchange narkive permalink

Jak dużą kontrolę masz nad obsługą tego serwera odbierającego? Wygląda na to, że rozwiązanie zaproponowane powyżej przez użytkownika, polegające na haszowaniu zarówno nazwy użytkownika, jak i hasła, byłoby możliwe do wykonania na kilka sposobów:

Metoda 1 (wymagająca JavaScript): Hash zarówno nazwę użytkownika, jak i hasło. W swojej bazie danych przechowuj zaszyfrowane nazwy użytkowników, a następnie przeprowadź wyszukiwanie uwierzytelniania, korzystając z tego pola. Byłoby to idealne rozwiązanie, jeśli masz pewną kontrolę nad sposobem traktowania danych na serwerze, ale nie kontrolujesz jego możliwości logowania.

Metoda 2 (niewymagająca JavaScript): Jak zwykle otrzymaj nazwę użytkownika w postaci zwykłego tekstu, ale przekonwertuj go na skrót, jak w metodzie 1, po otrzymaniu go na serwerze. Jeśli próba się nie powiedzie, zapisz skrót, a nie nazwę użytkownika. Dzienniki nadal będą przydatne (nieco mniej przydatne, gdy są sprawdzane kursorowo), ponieważ każdy hash nadal będzie jednoznacznie identyfikował użytkownika. Żadne z nich nie jest tak eleganckie, jak górna odpowiedź tutaj (i sugerowałbym użycie tego również), ale są dokładniejsze.

sharp12345
2013-03-06 08:52:51 UTC
view on stackexchange narkive permalink
  • zezwalają tylko na przesyłanie skrótów md5 nazw użytkowników ORAZ haseł (lub podobnych skrótów), dzięki czemu wszystko, co zostanie zarejestrowane w plikach dziennika, zawsze będzie wyglądało jak ustalona długość losowych znaków, co nie sprawi, że nikt szybko zgadnij, że jest to md5 hasła lub nazwy użytkownika.

Wada: Aby porównać nazwy użytkowników w swojej bazie danych, musisz zapisać dwie kolumny, np. „nazwa użytkownika” i „md5 (nazwa użytkownika)” LUB musisz dynamicznie haszować za każdym razem, gdy pytasz o nazwę użytkownika w celu zalogowania.


  • utwórz wpis dziennika tylko wtedy, gdy nazwa użytkownika istnieje w bazie danych, w przeciwnym razie rejestruj tylko adres IP.

  • tylko pozwól użytkownikowi na kliknięcie klawisza Enter za pomocą myszy, a nie klawiatury, lub zezwól na klawiaturę dopiero po 5 sekundach od ostatniego wpisanego znaku w dowolnym z pól, co da użytkownikowi czas na spojrzenie na ekran i zobaczenie swojego błędu.

  • ogranicz dozwolone nazwy użytkowników i hasła:

    1. hasła muszą zawierać znak specjalny, taki jak! @ # $% ^ & * ()
    2. nazwy użytkowników NIE mogą zawierać żadnych znaków specjalnych

W ten sposób możesz wykonać javascript, aby szybko zidentyfikować, czy wprowadzona nazwa jest nazwą użytkownika lub hasło.

louis_coetzee
2013-03-06 15:54:52 UTC
view on stackexchange narkive permalink

Prostym, ale irytującym rozwiązaniem może być ekranowy układ przycisków html, w którym użytkownicy mogą wpisywać swoją nazwę użytkownika tylko za pomocą tych przycisków, zapobiegnie to popełnieniu błędu, zdaję sobie sprawę, jak denerwujące może to zmienić być, ale po pierwszym logowaniu możesz użyć pliku cookie do zapamiętania nazwy użytkownika i nie wymagać jej ponownie. Oczywiście wymagany będzie Javascript. Teraz niemożliwe jest przypadkowe wysłanie hasła w postaci zwykłego tekstu. Mam nadzieję, że to pomoże.

prawda, ale co z ludźmi logującymi się do swojej domeny Windows z laptopa? Gromadzimy również te dzienniki.
Tek Tengu
2013-03-06 17:55:00 UTC
view on stackexchange narkive permalink

Mam inne podejście ... Jaki problem naprawdę próbujesz rozwiązać?

  1. Złe hasła? To znaczy. kiedy widzisz osobę używającą „hasła” (lub jego wariantu), chcesz mieć możliwość prześledzenia wstecz do użytkownika i poprawienia go?

  2. Hasła są wysyłane w sposób niezawodny?

  3. Albo problem z idiotami, którzy nie potrafią pisać ani czytać formularzy (albo może źle zaprojektowany interfejs użytkownika)?

Zawsze pamiętaj, że za każdym razem, gdy „dodajesz” do systemu, potencjalnie dodajesz złożoność i zdecydowanie dodajesz kod - oba te elementy zwiększają możliwość otwarcia gdzieś „dziur” w ogólnej architekturze (może to być stos, może być przez Internet, może być przez sieć ...). Więc rozwiązując którąkolwiek z tych trzech, musisz zmierzyć, czy wartość ich rozwiązania jest warta ryzyka wybicia dziury, o której nie wiesz - diabeł, którego znasz, jest zawsze lepszy niż diabeł, którego nie znasz.

Teraz do każdego.

Rozwiązywanie złych haseł powinno odbywać się podczas konfigurowania i zmiany hasła za pomocą reguł sprawdzania poprawności. I tylko tam. Dodanie innego miejsca, w którym można to zrobić, oznacza tylko ryzyko pomylenia reguł walidacji lub braku synchronizacji.

Hasła są wysyłane w sposób niezawodny. Kogo to obchodzi? To prawda, może wydawać się niebezpieczne, ale pamiętaj, że jest to uwierzytelnianie n częściowe, a jeśli masz tylko jedną część, nie różni się niczym od słowa w słowniku. Może, tylko może, jeśli masz aktywnego sniffera, może on dać im kilka wskazówek, ale wtedy włamanie już na miejscu jest twoim prawdziwym problemem, a nie jakimś sporadycznym, przypadkowym, grubym palcowaniem haseł w polu nazwy użytkownika. Teraz, jeśli wszystkie części są wysyłane z jasnym, dużym problemem.

Kwestia idiotów lub złego projektu interfejsu użytkownika. Ponownie zapośredniczaj użytkowników lub interfejs użytkownika. Prosty. Zapewnij aktywną pomoc w zakresie interfejsu użytkownika, poproś działy o szkolenie lub coś w tym stylu. Łatwa poprawka, która wymaga ograniczonych zmian w kodowaniu o niskim ryzyku (lub powinna - jednak uważać na aspekt interfejsu użytkownika).

Chociaż podziwiam wiele sugestii tutaj, a wiele z nich ma u podstaw wspaniałe pomysły. Polecam podejście KISS, bez BS, zawsze pamiętając, że dodając do swoich systemów ryzykujesz, że zwiększysz swoją niepewność.

Tylko moje 2 centy.

rjt
2014-07-31 14:21:09 UTC
view on stackexchange narkive permalink

Biometria jest teraz dość niedroga i działa przez co najmniej 80% czasu. Uważam, że jest świetny na TabletPC i chciałem wdrożyć klawiatury biometryczne, ponieważ jest szybszy (przynajmniej przez 80% czasu).

Założę się, że nie był to aż tak duży problem z Win2000 , WinXP, Win2003 i WinVista, ponieważ domyślnie pole nazwy użytkownika było już wypełnione ostatnią pomyślną nazwą użytkownika. Nie jestem pewien, która wersja katalogu ActiveDirectory lub stacji roboczej uległa zmianie, ale domyślnie pole nazwy użytkownika jest puste, co sprawia, że ​​problem jest bardziej rozpowszechniony.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...