Pytanie:
Czy używanie metody GET jako nazwy użytkownika / hasła logowania dla administratorów jest złą praktyką?
Amirreza Nasiri
2017-01-04 08:44:27 UTC
view on stackexchange narkive permalink

Pracuję nad aplikacjami internetowymi i jak wiesz, posiadanie panelu administratora jest w większości przypadków koniecznością. Widzimy, że wiele aplikacji internetowych ma określoną stronę logowania dla administratorów, w której znajduje się formularz (zwykle metoda POST ), którego administratorzy mogą używać do logowania się do panelu.

Ale ponieważ nazwy pól są znane, haker może próbować złamać hasła, nawet jeśli zaimplementowano pewne metody bezpieczeństwa.

Więc jaki jest problem z prostym kluczem GET (jak nazwa użytkownika) i jego wartość (jako hasło)? Dlaczego nie jest używany często lub przynajmniej nie jest zalecany w wielu artykułach?

Dla administratorów przyjazne dla użytkownika strony logowania nie są tak naprawdę potrzebne! Dane zostaną zarejestrowane w obu przypadkach ( GET / POST ), jeśli istnieje atakujący MiTM.

Ale używając tej metody, pola będą nieznane. dla samych administratorów. Oto przykładowy kod PHP:

"category.php": (bezsensowna nazwa strony)

  <? Phpif (isset ($ _ GET ['sensless_user']) && $ _GET ['sensless_word'] == "coś") {session_start (); $ _SESSION ["user"] = "test"; nagłówek („Lokalizacja: category.php”); // Przekieruj na tę samą lub inną stronę, aby parametry GET zniknęły z adresu URL} else {die (); // Więc to będzie jak pusta strona}? >  
Powinieneś używać HTTPS, wtedy nie musisz się martwić o MITM.Dodatkowo, jeśli nie zależy Ci na łatwości obsługi, możesz zaimplementować uwierzytelnianie HTTP Basic lub za pomocą certyfikatu klienta, wtedy nie musisz implementować uwierzytelniania w samej aplikacji internetowej.
Dzienniki serwera internetowego i dzienniki proxy, kropka, główne powody, aby POST te informacje, a nie ich POBIERZ.Wszystko, co mówią jdow i tlng05, jest również prawdą, ale dzienniki są najważniejszym elementem „ojej jest” z HTTP (S) GET.
Twój administrator na jakimś forum: „Hej, mam problem z panelem administracyjnym mojej witryny. Możesz go zobaczyć tutaj: http://example.com/category.php?catID=admin&pageNumber=hunter2
„* pola będą nieznane dla samych administratorów *” - nie jestem pewien, co przez to rozumiesz.Czy są generowane dynamicznie?A może sugerujesz „? Moja nazwa_użytkownika = moje hasło”?Dlaczego nie mogłeś zrobić tego samego z POST?
„POST” w porównaniu z „GET” nie jest *** główną *** przeszkodą dla hakerów, ale pomaga.Każda odrobina ... pomaga
Twoim większym problemem jest to, czy używasz HTTPS czy HTTP.Jeśli używasz tylko protokołu HTTP;POST lub GET są równie otwarte dla MITM.Jeśli zabezpieczasz kanał (którym powinieneś być), [GET jest nieco mniej bezpieczny.] (Http://stackoverflow.com/questions/4143196/is-get-data-also-encrypted-in-https)
_Ale ze względu na znane nazwy pól haker może próbować złamać hasła, nawet jeśli zaimplementowano pewne metody zabezpieczeń_ - To samo dotyczy konwencjonalnego żądania GET.Ale nie ma powodu, dla którego nie możesz używać dynamicznie generowanych nazw pól.przechowywanie wyszukiwania, które jest tym na serwerze.Nie zwiększa znacząco bezpieczeństwa, ale utrudni hakerom życie.
Żądania GET są również przechowywane w HISTORII w przeglądarce internetowej - to łatwy cel dla prawie każdego, kto zdoła uzyskać dostęp do komputera nawet na 15-20 sekund.
A umieszczenie nazwy użytkownika i hasła w żądaniu GET może sprawić, że będą one widoczne na pasku adresu przeglądarki, w zależności od długości adresu URL, co może stanowić problem, jeśli ktoś był wystarczająco blisko, aby zobaczyć Twój ekran.
Dlaczego nie skorzystać z metody autoryzacji, którą już mamy w adresach URL?`https: // użytkownik: pass@example.com /`.W ten sposób możesz utworzyć link do czegoś, co wymaga uwierzytelnienia, ale w rzeczywistości proces uwierzytelniania odbywa się za pośrednictwem nagłówków żądań i zazwyczaj nie pojawia się w dzienniku.
`nazwy pól są znane`: nie ma to znaczenia, chyba że używasz słabych haseł.`Administratorzy nie potrzebują łatwego logowania`: Następnie wystarczy ustawić uwierzytelnianie przez serwer WWW (np. apache).Możesz użyć uwierzytelniania podstawowego i przechowywać hasła w przeglądarce (przy użyciu klucza głównego) lub zainstalować certyfikaty klienta w przeglądarkach (hasła nie są potrzebne).Tak czy inaczej, jest to znacznie bezpieczniejsze niż użycie GET.
Jeśli zależy Ci na specyfikacjach, specyfikacja http zdecydowanie zaleca, aby zmienne GET były używane tylko do pobierania, a nie do modyfikowania stanu aplikacji.Oprócz względów bezpieczeństwa, które za tym stoją, _ może_ być czynnikiem, jeśli twój kod musi być certyfikowany zgodnie z jakąś rzeczą ISO lub tym podobną, która wymaga zgodności z normami.
GET jest wysoce podatny na [fałszerstwo żądań między witrynami] (https://en.wikipedia.org/wiki/Cross-site_request_forgery), np.za pomocą obrazów.Chociaż nie jest dla mnie oczywiste, w jaki sposób ktoś może to wykorzystać, najlepiej unikać wszelkich działań, które powodują wynik na serwerze (w tym przypadku logowanie) za pośrednictwem GET.Brak wiedzy, w jaki sposób coś może być wektorem ataku, nie oznacza, że nim nie jest.Unikaj problematycznych podejść, które są sprzeczne ze specyfikacją RFC.
Dziewięć odpowiedzi:
jdow
2017-01-04 09:29:50 UTC
view on stackexchange narkive permalink

Spowoduje to zapisanie łącza logowania wraz z hasłem i nazwą użytkownika w historii przeglądarki. Może również zostać przypadkowo przechwycony przez takie rzeczy, jak dzienniki zapory, które nie przechwytują zmiennych pocztowych.

Ponadto ludzie w każdym miejscu przekazują adresy URL z parametrami (wyobraź sobie, że Twoje zapytanie, z parametrami nazwy użytkownika i hasła, pojawia się na stackexchange).Może to również otworzyć cię na ataki CSRF.
Nawet jeśli używasz protokołu HTTPS, nadal istnieje wiele rozszerzeń przeglądarki, które zbierają pełny adres URL odwiedzanej strony.[WOT] (https://lifehacker.com/web-of-trust-sells-your-browsing-history-uninstall-it-1788667989) to niedawny przykład, który cieszy się dużym zainteresowaniem, ale są i były inne.
Pamiętam witrynę, która przeprowadziła odpowiednie uwierzytelnienie, a następnie wygenerowała klucz sesji, który osadził (styl GET) w adresie URL.Był raczej podatny na udostępnianie tego adresu URL, ponieważ więcej osób zauważa `? User = me & password = letmein`, ale`? Sess = 012345678` jest mniej oczywistym problemem.
Jeśli używasz przeglądarki Google Chrome, Twoja historia przeglądania jest również domyślnie wysyłana do Google.
tlng05
2017-01-04 09:51:04 UTC
view on stackexchange narkive permalink

Przychodzi mi do głowy kilka powodów, dla których nie byłoby to idealne:

  • W opublikowanym fragmencie kodu umieszczasz teraz na stałe tajny klucz w kodzie źródłowym swojego programu. To jest złe, ponieważ teraz, jeśli chcesz opublikować lub udostępnić swój kod źródłowy komukolwiek innemu, będziesz musiał pamiętać o redagowaniu tego klucza. Bezpieczeństwo systemu nie powinno być uzależnione od tego, czy jego kod źródłowy pozostaje ukryty.
  • To nie jest dobrze skalowane. Jeśli masz tylko jeden tajny klucz, który muszą udostępniać wszyscy administratorzy, o wiele łatwiej jest przypadkowo wyciec. Jeśli wycieknie, nie będziesz miał możliwości dowiedzenia się, kto był odpowiedzialny za wyciek. Mógłbyś podać inny klucz każdemu administratorowi, ale bardzo szybko staje się to kłopotliwe.
  • Nie można łatwo zmienić klucza. Ogólnie rzecz biorąc, prawdopodobnie będziesz potrzebować administratorów witryny, którzy nie są jednocześnie operatorami serwerów. Ale przy takiej konfiguracji nie można nikomu dać możliwości zmiany klucza bez przyznania również dostępu do kodu źródłowego i serwera, który może, ale nie musi, wiedzieć, jak używać uchwytu. Poprawianie kodu źródłowego działającego w systemie produkcyjnym chcąc nie chcąc jest podatne na błędy i prawdopodobnie spowoduje przestoje.
  • Ponieważ używasz GET, bardzo łatwo jest wyciekać klucz przez historię przeglądarki lub przypadkowo udostępnianie linków.
  • Nie jest to zbyt przyjazne dla użytkownika. Korzystanie z tego wymaga wiedzy, jak ręcznie manipulować określonym parametrem GET. Mówisz, że łatwość obsługi dla administratorów nie jest potrzebna, ale generalnie nie jest to prawdą. Cała Twoja witryna powinna być jak najbardziej przyjazna dla użytkownika, łącznie z panelem administracyjnym.

Podsumowując, widzę tego rodzaju system w użyciu jako środek tymczasowy w małej witrynie, gdzie jest jeden administrator witryny, który również napisał kod źródłowy witryny i zarządza serwerem. Ale cokolwiek większego, będziesz chciał mieć rzeczywisty panel logowania administratora z zaszyfrowanymi i solonymi danymi uwierzytelniającymi przechowywanymi w bazie danych, jak każdy inny użytkownik.

Odnośnie punktu 2: przekazanie różnych kluczy każdemu administratorowi nie jest tak naprawdę kłopotliwe.Tajne udostępnianie jest w rzeczywistości dość proste.
@Mego Miałem głównie na myśli bałagan w kodzie.np. co się dzieje, gdy chcesz przypisać różne poziomy uprawnień lub dodać / usunąć administratorów.Prowadzi to również do trzeciego punktu.
AbraCadaver
2017-01-04 20:42:06 UTC
view on stackexchange narkive permalink

Nie tylko z punktu widzenia bezpieczeństwa, ale Hypertext Transfer Protocol - HTTP / 1.1 RFC 2616 wyjaśnia to całkiem jasno:

... konwencja została ustalili, że metody GET i HEAD NIE POWINNY mieć znaczenia polegającego na podejmowaniu czynności innej niż pobieranie . Metody te należy uznać za „bezpieczne”. Pozwala to programom użytkownika na reprezentowanie innych metod, takich jak POST, PUT i DELETE, w specjalny sposób, dzięki czemu użytkownik jest świadomy faktu, że żądana jest potencjalnie niebezpieczna akcja.

GET powinno być używane tylko do pobierania. W Twoim przypadku przesyłasz dane do serwera, serwer wykonuje następujące określone działania (przynajmniej):

  • Uwierzytelnianie użytkownika
  • Tworzenie sesji do śledzenia stan użytkownika (PHP tworzy dane sesji w zwykłych plikach lub w bazie danych)
  • Ustawienie pliku cookie sesji do śledzenia sesji

POST przez HTTPS byłby preferowaną metodą transmisji dane wrażliwe; nazwa użytkownika, hasło w tym przypadku.

Operacje GET powinny być idempotentne, co oznacza, że możesz bezpiecznie wykonywać operację wielokrotnie.Innymi słowy, nie * zmieniasz * niczego na serwerze ... po prostu podajesz dane niezbędne do zażądania określonego zasobu (w tym przypadku uwierzytelnionej strony).W przypadku czegokolwiek innego niż statyczna witryna HTML, żądanie GET prawie zawsze będzie wykonywać ważne działania (np. Www.mystore.com/product.php?productid=123 nadal musi zbudować i wyświetlić stronę produktu).Używanie GET do poufnych danych jest rzeczywiście BARDZO złym pomysłem, ale niekoniecznie z powodu RFC 2616.
@DVK: To bardzo dobry powód, chociaż inne odpowiedzi są opisane w innych.Podczas logowania i rozpoczynania sesji (w PHP) na serwerze następuje kilka zmian, a sesja jest trwała na różnych stronach.
Operacje @DVK GET nie powinny być tylko idempotentne, powinny być czyste (o czym myślę).Bycie idempotentnym oznacza, że zrobienie tego dwa razy ma takie same skutki uboczne, jak zrobienie tego raz.Bycie czystym oznacza zrobienie tego raz ma takie same skutki uboczne, jak całkowite zaniechanie.Dla porównania DELETE jest idempotentny, ale nie czysty.
@James_pic „Bycie czystym oznacza zrobienie tego raz ma takie same skutki uboczne, jak brak robienia tego w ogóle”.Kiedy mówimy o znaczeniu, mówimy o zasobach, a nie o wywołaniu procesów po stronie serwera, niezbędnych do pobrania zasobu.Logowanie naprawdę nie ma skutków ubocznych w zakresie zasobów.Nie tworzy, nie usuwa ani nie zmienia zasobu.Zawiera dane niezbędne (w tym przypadku informacje uwierzytelniające) do zlokalizowania i wyświetlenia zasobu, tak samo jak? Productid = 123.Główna różnica polega na tym, że specyfikacja RFC określa, że poufne informacje NIE powinny znajdować się w GET.
@AbraCadaver Prawie każda dynamiczna witryna będzie wywoływać zmiany na serwerze dla każdego żądania, niezależnie od tego, czy uwierzytelnisz się, czy nie.Ważne jest, abyś nie robił nic z samymi zasobami.Wszelkie zmiany po stronie serwera są jedynie przypadkowe podczas wyświetlania zasobu.Użytkownik logujący się lub nie logujący się (lub logujący się 9 razy) na ogół nie ma wpływu na zasoby, do których próbuje uzyskać dostęp, więc uważam, że logowanie jest czyste (bezpieczne).Jeśli utworzenie sesji wyklucza użycie GET, wówczas GET może być zasadniczo używany tylko dla zasobów statycznych.
@DVK: Na zakończenie, ** NIE POWINNO ** i ** inne niż pobieranie ** wydają się całkiem proste.Podczas logowania akcja zmienia stan z nieuwierzytelnionej na uwierzytelnioną i prawdopodobnie uzyskuje dostęp do dodatkowych danych i / lub akcji.
Nie obowiązuje zasada, że GET nie powinien nic robić z zasobami.Zasada jest taka, że GET nie powinien być rozumiany jako żądanie od klienta zrobienia czegokolwiek - wszystko, co się dzieje, dzieje się, ponieważ serwer zdecydował, że chce to zrobić, a klient nie powinien być za to odpowiedzialny.
Andy Holland
2017-01-04 17:40:34 UTC
view on stackexchange narkive permalink

Jak dobrze radzisz sobie z przechowywaniem haseł administratora w postaci zwykłego tekstu w dziennikach dostępu do serwera WWW?

Problem, który widzę tutaj, polega na tym, że żądanie GET musi umieścić wszystkie nazwy pól i wartości w identyfikatorze URI żądania. Identyfikatory URI żądań są rejestrowane przez różnego rodzaju procesy i prawdopodobnie będą przechowywane w całości w dzienniku dostępu do serwera WWW.

Oznacza to, że dziennik dostępu do serwera WWW zwiększa zagrożenie bezpieczeństwa, ponieważ zawiera teraz nazwy użytkowników i hasła do stron logowania opartych na GET. Chociaż możesz ogólnie traktować dzienniki serwera jako zawierające informacje uprzywilejowane (na przykład adresy IP klienta), zwykle nie są one tak wrażliwe, aby zawierały wystarczającą ilość informacji, aby zagrozić interfejsowi administracyjnemu klienta.

POST jest lepszy do tego, ponieważ nazwy pól i wartości nie są przechowywane w dzienniku.

Machavity
2017-01-05 00:04:25 UTC
view on stackexchange narkive permalink

Złośliwy użytkownik uzyskuje poświadczenia administratora. Korzystanie z tagu obrazu

  <img src = "https://example.com/login?username=admin&;password=topsecret" style = "display: none" >  

oszukują Twoją przeglądarkę, aby się zalogowała (obrazy domyślnie nie podlegają ograniczeniom międzydomenowym). Następnie mogą użyć serii wywołań „obrazu”, aby uzyskać lub zmienić dane (wiele wywołań AJAX również używa GET niepoprawnie). Istnieją sposoby, aby tego uniknąć, ale większość ludzi ich nie umożliwia. Jeśli używasz POST, ten wektor ataku nie działa.

Klucz pola jest nieznany, jak osoba atakująca może to odgadnąć?
Jak wspomniano w innym miejscu, można to pobrać z przeglądarki lub udostępnić użytkownikowi.Bezpieczeństwo dzięki niejasności trwa tylko tak długo, jak długo zależy to użytkownikom.
@AmirrezaNasiri, jeśli istnieje publicznie widoczny formularz logowania za pomocą GET, w jaki sposób nazwa pola hasła może być nieznana?
Myślę, że @AmirrezaNasiri sugeruje, że nie byłoby widocznego formularza - zamiast tego administratorzy po prostu wiedzieliby, jak wpisać parametry get w pasku adresu.
Lucas
2017-01-04 18:11:21 UTC
view on stackexchange narkive permalink

Problem z używaniem metody get polega na tym, że dane będą domyślnie widoczne na ekranie i w dziennikach serwera WWW.

Moją zasadą jest używanie postów dla haseł i dużych informacji, takich jak artykuł na blogu redaktorzy i używaj get do większości innych rzeczy. Oczywiście istnieje kilka wyjątków, w których dane są zbyt poufne, aby pojawiać się nawet w dziennikach. Ale są one rzadkie nawet w sektorze korporacyjnym.

Na przykład mam funkcję podobną do kreatora z 5 krokami, w których generuję identyfikator procesu na pierwszym kroku i na każdym kroku zobaczysz ? proc_id = 123 . PHP obsługuje ciąg zapytania nawet w metodach wysyłania. Nawet na etapie, w którym dane formularza są zbyt duże i jestem zmuszony użyć metody post, identyfikator procesu nadal jest widoczny w adresie URL, na przykład ?proc_id=123.

To ułatwia tworzenie zakładek, ułatwia zrozumienie dzienników dostępu, a także jest bardziej pouczająca dla osób trzecich, które chcą zintegrować się z moimi aplikacjami.

W tym scenariuszu należy podjąć pewne środki ostrożności, aby uniknąć problemów z przyciskiem Wstecz takie jak usuwanie z historii adresów URL, których nie można przesyłać ponownie. Większość akcji zapisywania jest właśnie taka.

Oczywiście POST nie ochroni Cię przed atakiem MiTM. Zapobiegnie tylko zapisywaniu poufnych informacji, takich jak hasła, w dziennikach Twojej witryny i w lokalnej historii przeglądarki.

Andre Geddert
2017-01-04 22:04:00 UTC
view on stackexchange narkive permalink

Weź również pod uwagę, że żądania GET nie mają na celu niczego zmieniać po stronie serwera. Zmiana stanu, taka jak „wylogowany” -> „zalogowany”, zawsze musi być wykonana za pomocą żądania POST.

Posiadanie parametru GET, takiego jak

  https: / /example.com/loginpage.php?password=topsecret 

jest semantycznie dokładnie taka sama jak

  https://example.com/loginpage/password / topsecret 

Więc nie ma żadnego uwierzytelnienia. To tylko „tajny” adres URL, który musisz znać, aby się „zalogować”.

Aby było jaśniej. Jeśli używasz na przykład Apache, możesz uzyskać ten sam wynik przy takim przekierowaniu:

 RedirectTemp hasło / topsecret veryobfuscateddirectoryname / loggedin 

a następnie na stronie logowania umieść swój session_start ()

Leo Wilson
2017-01-07 21:55:20 UTC
view on stackexchange narkive permalink

Nawet jeśli użytkownik i hasło nie były zapisane w historii przeglądarki (którą są jako parametry adresu URL), sprawia to, że kradzież Twoich danych jest niezwykle łatwa dla każdego hakera. Pojawi się w dziennikach serwera, dzięki czemu jeszcze łatwiej przeprowadzić atak typu man-in-the-middle. Pozwala także na wiele złych praktyk, takich jak tworzenie zakładek adresu URL logowania, zapominanie o nim i pozwalanie innym ludziom na używanie ich przeglądarki internetowej.

TL; DR: To okropny pomysł.

bdsl
2017-01-07 05:44:37 UTC
view on stackexchange narkive permalink

Tak, to zła praktyka. Wszelkie korzyści w zakresie bezpieczeństwa dostępne dzięki posiadaniu tajnej nazwy pola można również uzyskać, dołączając ten sekret do hasła.

Zamiast GET z

  elephant = rthg4e5sdc  

lepiej byłoby używać POST z

  password = elephantrthg4e5sdc  

I oczywiście możesz ponownie zwiększyć bezpieczeństwo, zmieniając to na coś bardziej podobnego do

  password = ehu3dva7rthg4e5sdc  


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...