Czy w parametrach URL można przekazać użytkownika / hasło dla podstawowego uwierzytelnienia HTTP?

153

Wierzę, że to nie jest możliwe, ale ktoś, kogo znam, nalegał, aby to zadziałało. Nie wiem nawet, jakie parametry wypróbować i nigdzie nie znalazłem tego udokumentowanego.

Próbowałem http://myserver.com/~user=username&password=mypassword, ale to nie działa.

Czy możesz potwierdzić, że tak naprawdę nie można przekazać użytkownika / przekazać za pomocą parametrów HTTP (GET lub POST)?

ripper234
źródło
@sam - co? Jak wyglądałby pełny adres URL?
ripper234
4
Wszystko w specyfikacji ietf.org/rfc/rfc1738.txt (3.1)
Smudge
@sam - Niestety, z jakiegoś powodu po prostu nie udało mi się przeanalizować Twojego komentarza.
ripper234

Odpowiedzi:

199

W rzeczywistości nie jest możliwe przekazanie nazwy użytkownika i hasła za pomocą parametrów zapytania w standardowym uwierzytelnianiu HTTP. Zamiast tego używasz specjalnego formatu adresu URL, takiego jak ten: http://username:[email protected]/- wysyła poświadczenia w standardowym nagłówku HTTP „Autoryzacja”.

Możliwe, że ktoś, z kim rozmawiałeś, myślał o niestandardowym module lub kodzie, który sprawdzał parametry zapytania i weryfikował poświadczenia. Nie jest to jednak standardowe uwierzytelnianie HTTP, jest to funkcja specyficzna dla aplikacji.

womble
źródło
1
Dzięki, właśnie tego szukałem ... to nie jest krytyczne, że to parametry GET, tylko że mogę stworzyć to w adres URL.
ripper234
42
Do Twojej wiadomości, http://username:[email protected]format ten nie jest już obsługiwany przez IE ani Chrome , nie zdziwiłby się, gdyby inni poszli w jego ślady, jeśli jeszcze tego nie zrobili.
TJ Crowder
11
Właściwie działa dobrze w Chrome. Tylko IE jest zepsutym bachorem.
Damien Overeem ツ
1
@DamienOvereem na jakiej wersji Chrome jesteś? Mam Mac OS X 37 i wydaje się, że to nie działa dla mnie
Chris DaMour
11
Od tego czasu dowiedziałem się, że Chrome miał wyłączoną funkcję na jakiś czas, ale później ponownie włączyłem tę funkcję. Dowiedziałem się również, że Safari wyrzuca błędy phishingowe podczas uruchamiania tego typu linków. Zasadniczo czas uwierzytelniania http opartego na adresach URL dobiegł końca.
Damien Overeem ツ
18

Przekazywanie podstawowych parametrów uwierzytelniania w adresie URL nie jest zalecane

W tym celu znajduje się pole nagłówka Autoryzacja. Sprawdź tutaj: lista nagłówków http

Jak go używać, jest napisany tutaj: Podstawowe uwierzytelnianie dostępu

Można tam również przeczytać, że chociaż jest ono obsługiwane przez niektóre przeglądarki, sugerowane rozwiązanie dodania poświadczeń autoryzacji podstawowej w adresie URL nie jest zalecane.

Przeczytaj także rozdział 4.1 w RFC 2617 - Uwierzytelnianie HTTP, aby uzyskać więcej informacji na temat tego, dlaczego NIE należy używać uwierzytelniania podstawowego.


Przekazywanie parametrów uwierzytelniania w ciągu zapytania

Korzystając z OAuth lub innych usług uwierzytelniania, często możesz również wysłać token dostępu w ciągu zapytania zamiast w nagłówku autoryzacji, więc coś takiego:

GET https://www.example.com/api/v1/users/1?access_token=1234567890abcdefghijklmnopqrstuvwxyzABCD
Więdnąć
źródło
W jaki sposób można zakodować nagłówek autoryzacji w adresie URL?
womble
2
Czy nie jest to, że formularz, który podałeś, jest już nieaktualny?
womble
2
Pytanie, na które odpowiedziałeś „W tym celu jest pole nagłówka Autoryzacja”, dotyczyło sposobu umieszczenia parametrów uwierzytelniania w adresie URL . Jeśli nie możesz zakodować pól nagłówka HTTP w adresie URL (czego nie możesz), twoja odpowiedź nie jest sekwencyjna.
womble
Czy możesz zacytować, gdzie według standardu URI jest powiedziane, że przekazywanie podstawowych parametrów uwierzytelniania w URI jest przestarzałe? RFC 2396 mówi tylko, że nie jest „ZALECANE”, ponieważ szczegóły uwierzytelnienia w postaci zwykłego tekstu nie są w wielu przypadkach dobrym pomysłem (o czym się zgadzam), podczas gdy RFC 7235 nic nie wspomina. Nigdzie w specyfikacjach, które mogę przeszukiwać, nie napisano, że jest przestarzałe.
Lie Ryan
1
@Wilt: Muszę przeprosić, naprawdę masz rację. Twoja wskazówka, że ​​specyfikacja została „zmieniona”, zachęciła mnie do dalszych badań (RFC nigdy nie jest modyfikowany po opublikowaniu / ponumerowaniu). Właśnie odkryłem, że RFC 2396 został faktycznie zastąpiony przez RFC 3986 , czego wcześniej nie mogłem znaleźć. RFC 3986 wspomina o wycofaniu się nazwy użytkownika: składnia hasła:Use of the format "user:password" in the userinfo field is deprecated.
Lie Ryan
17

http: // nazwa użytkownika: hasł[email protected] będzie działać w FireFox, Chrome, Safari ALE nie w IE.

Baza wiedzy Microsoft

Girish Kumar
źródło
2
Ta funkcja została usunięta z Chrome 19+. Zobacz code.google.com/p/chromium/issues/detail?id=123150
Moshe Katz
4
Po przeczytaniu tego raportu o błędach został on ponownie dodany do przeglądarki Chrome 20. Z pewnością spodziewałbym się, że wielu z nich narzeka, jeśli tak nie było.
womble
I teraz o to Internet Explorer: connect.microsoft.com/IE/feedback/details/873575/... . Nieco inny przypadek użycia, ale dotyczy tego samego problemu;)
SimonSimCity
@Diago, jeśli hasło zawiera „@”, to nie działa. powoduje błąd krytyczny, czy ktoś może mi powiedzieć, w jaki sposób możemy podać nazwę użytkownika i hasło na raz
Ashish Jain
@AshishJain - spróbowałbym uciec @od hasła jako %40. (Nie wiem jednak, czy to działa, i może zależeć od serwera lub kombinacji przeglądarka / serwer.)
David Moles
0

Możliwe jest (oczywiście) wysłanie dowolnego ciągu w parametrach GET, choć nie zaleca się wysyłania loginu i hasła, ponieważ może to być bardzo widoczne, szczególnie jeśli nie jest to żądanie AJAX.

Konieczne będzie jednak zakodowanie strony serwera, aby wyodrębnić login i hasło, a następnie zweryfikować je i używać w dowolny wymagany sposób.

Steve Smith
źródło