Pytanie:
Resetowanie hasła podające wskazówki dotyczące możliwych prawidłowych adresów e-mail
davshowhan449
2020-03-19 18:25:56 UTC
view on stackexchange narkive permalink

Mamy system, w którym jeśli zapomniałeś hasła i chcesz je zresetować, przejdź do strony zapomnianego hasła i wprowadź swój adres e-mail. Na Twój adres e-mail zostanie wysłany tymczasowy link umożliwiający zresetowanie hasła.

Teraz, gdy poddaliśmy naszą aplikację testom penetracyjnym, znaleziono problem:

Aplikacja daje wskazówki dotyczące możliwych prawidłowych adresów e-mail podczas próby zresetowania hasła. Funkcjonalność tę można nadużywać, po prostu odgadując możliwy adres e-mail i będąc w stanie znaleźć prawidłowe za pomocą komunikatów o błędach.

Cóż, jest tylko jedno pole i oczywiście jest oczywiste, że jeśli zresetujesz hasło próba nie powiodła się, przyczyną jest nieprawidłowy adres e-mail. Wygląda na to, że ten test penetracyjny jest błędny. Czy są jakieś rozwiązania, aby rozwiązać ten problem, oprócz dodania dodatkowego pola (oprócz adresu e-mail) do resetowania hasła?

ważne jest, aby wyjaśnić różnicę między „nieprawidłowym adresem e-mail” a „niezarejestrowanym adresem e-mail”.jeśli użytkownik wpisze coś, co nie pasuje do formatu prawidłowego adresu e-mail, oczywiście z punktu widzenia bezpieczeństwa jest w porządku, aby poinformować go, że proces się nie powiódł.Jeśli jednak wpiszą prawidłowy adres e-mail, który nie jest powiązany z zarejestrowanym użytkownikiem, informacje te mają pozostać prywatne.
Jaką odpowiedź udzielasz użytkownikowi, który podczas logowania używa nieprawidłowego adresu e-mail?
@DocRoot: Najlepszą praktyką jest odpowiadanie za pomocą ogólnej wiadomości, takiej jak „Nieprawidłowy adres e-mail lub hasło” (zakładając, że jako poświadczeń używasz kombinacji adres e-mail + hasło).
@bhorkarg Tak, wiem.Miało to służyć jako wskazówka / pytanie retoryczne dla PO.Jeśli wysyłają „ogólny” (błąd) komunikat przy nieudanej próbie logowania (jak oczekiwałbym, ponieważ jest to bardzo dobrze znana praktyka w interesie bezpieczeństwa konta użytkownika), to po co podawać bardziej „odkrywczą” odpowiedź na innym etapiew procesie konta użytkownika?
Sześć odpowiedzi:
yoozer8
2020-03-19 18:35:05 UTC
view on stackexchange narkive permalink

Nie oznaczaj, że próba „nie powiodła się”. Użytkownik (uprawniony lub inny) prosi o link do resetowania hasła i podaje adres e-mail. Wszystko, co powinieneś tutaj powiedzieć, to

Twoje zgłoszenia zostały odebrane. Jeśli mamy konto pasujące do Twojego adresu e-mail, otrzymasz wiadomość e-mail z linkiem do zresetowania hasła.

Użytkownik nadal otrzyma łącze (powodzenie), ale atakujący nie wiedzieć, czy podany adres e-mail jest powiązany z kontem.

Po co w ogóle dodawać drugie zdanie?Po prostu podaj ogólne „Twoje zgłoszenie zostało odebrane i będzie przetworzone”.
Prawdziwi użytkownicy czasami zapominają, którego adresu e-mail użyli, więc dobrze jest dać im ostrzeżenie, że żądanie może się nie powieść z powodu nieistniejącego konta, a wiadomość e-mail została oznaczona jako spam itp.
Poza tym po prostu informuje użytkownika, czego się spodziewać.Tak, większość z nas przeszła już przez ten proces i wie, że powinniśmy poszukać e-maila.Ale dla kogoś, kto resetuje hasło po raz pierwszy, chcesz dać mu znać, czego może się spodziewać dalej.
Ale tego samego można się dowiedzieć, wypróbowując rejestrację.Chyba że mówisz również „rejestracja może się udać lub nie”, co dla mnie brzmi okropnie.Podsumowując, wydaje się, że łatwo ominąć zaciemnienie kosztem użyteczności (jeśli użytkownik błędnie wpisuje swój adres e-mail, nigdy go nie dowie i będzie czekał na próżno).
co jeśli są strony, które pojawią się później?jak warunki, powiadomienia, informacje, reklamy, ankiety itp. przed faktycznym wysłaniem wiadomości e-mail?może to wpłynąć na wrażenia użytkownika.Legalny użytkownik mógłby powiedzieć, że przeszedłem przez to wszystko i na koniec nie powiedzieli mi, że mój adres e-mail jest nieprawidłowy?
Czy te strony są naprawdę potrzebne?Gdybym musiał wypełnić ankietę, odrzucić kilka reklam i przeczytać Warunki korzystania z usługi przed zresetowaniem hasła, poważnie bym się zastanawiał, czy w ogóle korzystam z tej usługi.Zresetowanie hasła powinno być tak proste, jak zapisanie mojego adresu e-mail i kliknięcie przycisku.
-1 Ponieważ mówisz o najłatwiejszej implementacji, nawet nie dotykając powiązanego modelu zagrożenia.Na przykład, jak wskazano w komentarzach, ujawnianie już zarejestrowanych e-maili użytkowników jest typową cechą formularzy rejestracyjnych, a ważną rzeczą jest często zapobieganie brutalnemu wymuszaniu poprzez ograniczanie liczby adresów IP.Nie wspominasz też o ogromnym uderzeniu w UX i niebezpieczeństwach związanych z udzieleniem tej samej odpowiedzi (prawdziwi użytkownicy są bardziej ranni niż złośliwi aktorzy)
Użytkownicy @davshowhan449 powinni być zobowiązani zaakceptować Warunki korzystania z usługi podczas rejestracji, a nie podczas użytkowania
@Christoph „Zastanowiłbym się poważnie, czy w ogóle korzystam z tej usługi” to dziwny sposób na napisanie „Usunąłbym swoje konto i nigdy nie wróciłbym”
W przypadku rejestracji konta możesz uniknąć ujawniania tych informacji, jeśli nowe konta będą niedostępne bez weryfikacji e-mailowej.Żadna z tych technik nie jest trudna;to tylko kwestia ustalenia, czy istnienie konta jest wystarczająco tajne, aby uzasadnić atak na UX.I oczywiście możesz złagodzić problemy z UX, wysyłając e-mail nawet w przypadku awarii (np. Możesz wysłać e-mail z informacją o nieznalezionym koncie, gdy resetowanie hasła nie powiedzie się).
W każdym przypadku należy wysłać wiadomość e-mail na podany adres e-mail.Jeśli z tym adresem nie jest skojarzone żadne konto, poinformuj właściciela tego konta e-mail o próbie zresetowania hasła.Jeśli osoba trzecia próbowała zresetować hasło, wie, że ktoś ją atakuje.Jeśli zapomną adresu e-mail, którego użyli do rejestracji, nie będą dłużej czekać na wiadomość e-mail lub pomyślą, że Twój system jest uszkodzony, ale po prostu wypróbuj inny adres.
@UTF-8 Czy masz na myśli, że e-mail powinien zostać wysłany na adres, niezależnie od tego, czy jest zarejestrowany w systemie, czy nie?Wydaje się to wątpliwe.Zdecydowanie nie chciałbym otrzymywać e-maili z jakiejś usługi, z którą nie mam nic wspólnego tylko dlatego, że ktoś umieścił mój adres e-mail w formularzu internetowym.
@DavidZ Sprawdźmy więc, jak popularne usługi, z których wszyscy korzystamy, radzą sobie w tej sytuacji.Idk, może SE?Dlatego właśnie podłączyłem adres e-mail, który nie jest powiązany z moim kontem StackExchange, do formularza „Nie pamiętam hasła”.Co dostałem?E-mail z informacją: „Otrzymaliśmy prośbę o odzyskanie konta na Meta Stack Exchange dla [mój dodatkowy adres e-mail], ale ten adres e-mail nie istnieje w naszych rejestrach”.
@DavidMulder Moim problemem związanym z ograniczaniem szybkości dla każdego adresu IP jest to, że często blokuje ono legalnych użytkowników VPN, co jest również wielkim hitem dla UX.
@Schwern Posiadanie niewielkiej części użytkowników, którzy będą mieli nieco gorszy, ale nadal funkcjonalny formularz rejestracyjny (biorąc pod uwagę, że został dobrze zaprogramowany), nie wydaje się wielkim hitem (szczególnie w porównaniu z alternatywą: rozłącznym procesem rejestracji, w którym otrzymujesze-mail, aby kontynuować rejestrację).Ale tak, masz absolutną rację, biorąc pod uwagę użytkowników VPN, które są tego warte.
@DavidMulder Nie będzie wielkim hitem, dopóki nie zostaniesz zablokowanym użytkownikiem VPN.Nie wiem, czy ostatnio przeglądałeś wiadomości, ale wkrótce zobaczymy o wiele więcej osób pracujących z domu w sieciach VPN.:grymas:
Demento
2020-03-19 18:34:12 UTC
view on stackexchange narkive permalink

Przyczyną tego odkrycia jest to, że użytkownik otrzymuje różne odpowiedzi w zależności od istnienia adresu e-mail. Może to być tak proste, jak powiedzenie im, że adres nie jest znany lub coś bardziej subtelnego w odpowiedzi.

Najłatwiejszą implementacją pozwalającą uniknąć tego rodzaju problemu jest podanie dokładnie tej samej odpowiedzi , bez względu na to, czy adres e-mail istnieje, czy nie. Prosty

Informacja o zresetowaniu hasła została wysłana na podany adres e-mail. Jeśli nie otrzymasz e-maila, sprawdź, czy podałeś prawidłowy adres.

załatwi sprawę.

Jeśli adres e-mail jest Ci znany, wyślij informacje dotyczące resetowania hasła. Jeśli nie istnieje, nie rób nic. Prawdziwy użytkownik otrzyma łącze, a osoba atakująca nie może określić, czy wiadomość e-mail została wysłana, czy nie.

ma sens.Dziękuję Ci.dlaczego wcześniej o tym nie pomyślałem?
@davshowhan449 - nie martw się, jest to bardzo powszechna luka w aplikacjach internetowych i łatwo ją przeoczyć.Zła wiadomość jest taka, że takie problemy są faktycznie wykorzystywane w środowisku naturalnym i trudno je złagodzić w krótkim czasie, kiedy to nastąpi.Dlatego zalecam naprawienie tego na czas, chociaż na pierwszy rzut oka jest to „tylko ujawnienie informacji”.
co jeśli są strony, które pojawią się później?jak warunki, powiadomienia, FYI, reklamy, ankiety itp. przed faktycznym wysłaniem wiadomości e-mail?może to wpłynąć na wrażenia użytkownika.Legalny użytkownik mógłby powiedzieć, że przeszedłem przez to wszystko i na koniec nie powiedzieli mi, że mój adres e-mail jest nieprawidłowy?
@davshowhan449 Następnie pozbądź się również tych dodatkowych stron.I dobra zabawa, bo to przede wszystkim brzmi jak okropne doświadczenie.Ale może warto zadać nowe pytanie.
@davshowhan449 Chyba nigdy nie widziałem tego na stronie resetowania hasła.Zakłada się, że jesteś już członkiem usługi, nie musisz prosić użytkownika o zgodę na Warunki.Inne rzeczy nie pojawiają się, dopóki nie odpowiesz na link wysłany e-mailem.
@davshowhan449 Chociaż nadal nie jest to wspaniałe doświadczenie użytkownika, jednym ze sposobów naprawienia tego przepływu pracy byłoby przeniesienie wszelkich * niezbędnych * stron po kliknięciu przez użytkownika łącza w wiadomości e-mail.
Michael P
2020-03-19 19:15:52 UTC
view on stackexchange narkive permalink

Jako dodatek do powyższych odpowiedzi (lepiej by się nadawał jako komentarz, ale jeszcze nie może tego zrobić) kolejnym krokiem, jaki może podjąć haker, jest zmierzenie CZASU Twojej odpowiedzi na formularz. Ustalenie, że wiadomość e-mail nie istnieje, może zająć 10 ms, natomiast wygenerowanie łącza resetowania i wysłanie wiadomości e-mail może zająć 100 ms. Haker może wiedzieć, czy odpowiedź jest wolniejsza, że ​​jest to udane znalezienie. Możesz zastosować losowy wyłącznik czasowy w przypadkach, gdy wiadomość e-mail nie zostanie znaleziona, aby obie odpowiedzi zajęły tyle samo czasu.

Witamy w serwisie, daj pierwsze +1!Dziękuję za dodanie.Istnieje jednak jeszcze prostsze rozwiązanie tego problemu.Po prostu wyślij odpowiedź od razu, bez uprzedniego sprawdzania wiadomości e-mail.W ten sposób czas odpowiedzi jest również niezależny od ważności adresu e-mail.
@Demento Jest to koncepcyjnie łatwe, ale może być trudne technicznie - wiele podstawowych backendów sieciowych nie ułatwia takiego asynchronicznego przetwarzania, ponieważ domyślnie wiążą one czas życia wątku przetwarzania z odpowiedzią HTTP.
@Bob tak, jest to trochę trudniejsze, ale nadal bardzo podatne.Jeśli masz kolejkę wiadomości, możesz jej użyć lub iść biedny człowiek / old skool z cronem, który co minutę wyskakuje z bazy danych oczekujących na zresetowanie.
Ten problem znika, jeśli wyślesz wiadomość e-mail „nie można zresetować hasła: nie znaleziono konta”.
Brian I zagłosowałem za tobą, ale pamiętaj, że (bez kontroli) dałeś atakującemu A możliwość spamowania użytkownika S za pomocą twojej usługi.
Na marginesie - nie używaj losowego snu, można go statystycznie odfiltrować.Zobacz np.https://stackoverflow.com/questions/28395665/could-a-random-sleep-prevent-timing-attacks Opóźnienie obliczone na dostatecznie długie, aby obie odpowiedzi zajęły ten sam czas, może pomóc, ale losowe nie.
Jeśli wyślesz do wszystkich tę samą odpowiedź, jak sugerowano w innych odpowiedziach, odpowiedź HTTP może być bardzo prosta, nawet jako statyczna strona HTML lub przekierowanie.Sprawdzanie i wysyłanie odbywa się asynchronicznie lub jeśli Twoja platforma nie obsługuje tego po wysłaniu odpowiedzi.To znaczy zamiast sprawdzić, wysłać, odpowiedzieć, to odpowiedzieć, sprawdzić, wysłać.
David Mulder
2020-03-20 14:10:14 UTC
view on stackexchange narkive permalink

Przed czym chronimy?

Przede wszystkim należy zapytać, przed czym dokładnie chronią. W tym przypadku istnieją dwa różne zagrożenia:

  • Zagrożenie 1 Brutalny atakujący wymusza na losowych wiadomościach e-mail znalezienie prawidłowych zarejestrowanych wiadomości e-mail. Teoretycznie można by to wykorzystać do tworzenia list spamu, ale o ile wiem, nigdy nie zostało to zrobione, ponieważ łatwiej jest po prostu wysłać e-maile, niż przejść przez dodatkowe problemy (ile razy otrzymałem spam z żądaniem mojego [niektórych konto bankowe], mimo że nie mieszka w USA, jest niezliczone).
  • Zagrożenie 2 Osoba atakująca atakuje określonego użytkownika lub listę określonych użytkowników. Jest to szczególnie ważne, gdy sam fakt, że ktoś jest gdzieś zarejestrowany, może mieć konsekwencje. Przykład: sam fakt posiadania konta na Grindr lub Ashley Madison może być niebezpieczny w niektórych społecznościach.

Szerszy obraz

Następnym pytaniem do przemyślenia jest inne miejsca mogą ujawniać te same informacje i traktować je jako całość. Zwykle formularz rejestracyjny poinformuje użytkownika, czy podany adres e-mail jest już zarejestrowany, ale nie dotyczy to oczywiście większości oprogramowania B2B. Poza tymi funkcjami `` udostępnij użytkownikowi '' (pole wejściowe, w którym można wprowadzić wiadomość e-mail, aby udostępnić jakiś obiekt temu użytkownikowi) często również ujawnią te informacje, ale ponieważ są one rzadkie, nie uwzględnię ich w tej odpowiedzi.

Rozwiązania dla systemu z rejestracją publiczną

Przede wszystkim warto przyznać, że nie informowanie użytkownika o tym, że konto już istnieje w trakcie rejestracji jest z punktu widzenia UX bardzo nieprzyjemne. To samo dotyczy formularzy resetowania hasła, które po cichu zawodzą 1 , gdy użytkownik popełnia literówkę lub ma wiele wiadomości e-mail. Nie oznacza to, że jest to coś, czego nie powinno się robić, ale należy to porównać z zagrożeniami i korzyściami dla bezpieczeństwa.

Biorąc pod uwagę system z rejestracją publiczną, ważną rzeczą do rozważenia jest to, jak duże jest Zagrożenie 2 dla użytkowników Twojego produktu. Biorąc pod uwagę nawet niewielkie ryzyko, rozsądnie jest zmienić formularz rejestracyjny, aby rozpocząć od wpisania tylko imienia i nazwiska i adresu e-mail, podając wiadomość „sprawdź swój adres e-mail, aby kontynuować rejestrację”, a jeśli adres e-mail jest już zarejestrowany, wysłanie użytkownikowi e-maila im tego. Podobnie w takim przypadku formularz resetowania hasła w żaden sposób nie poinformuje użytkownika, czy e-mail jest ważny.

Z drugiej strony, jeśli Zagrożenie 2 jest minimalne, musimy modelować wyłącznie pod kątem Zagrożenia 1 . Oczywiście poprzednie podejście zadziała również doskonale przeciwko Zagrożeniu 1, ale biorąc pod uwagę koszt UX warto rozważyć inne rozwiązania. Najbardziej oczywistym rozwiązaniem jest ograniczenie szybkości 2 zarówno w przypadku sprawdzenia „e-maila istnieje”, jak i „zapomnienia hasła” (technicznie rzecz biorąc, wywołania te mogą nawet trafiać do tego samego punktu końcowego API). Często są one zaprojektowane tak, aby były dość łagodne dla pierwszych około 10 połączeń, ale po tym czasie bardzo szybko się ograniczają.

Ważne : nigdy nie usuwaj komunikatów o błędach z hasła rejestracja bez wprowadzania podobnych ograniczeń w formularzu rejestracyjnym.

Rozwiązania dla systemu bez rejestracji publicznej

Wszystko sprowadza się do tych samych problemów, co powyżej (i powinienem był napisać to najpierw ), ale bez „dodatkowego” kosztu trafienia do UX rejestracji stosunkowo „taniej” jest mieć bezpieczną formę zapomnienia hasła, chociaż oczywiście jest to nadal nieprzyjemne dla użytkowników i nadal można rozważyć, czy ograniczenie szybkości nie jest wystarczające dla Twojego konkretnego modelu zagrożeń.

Uwagi

1: Zamiast po cichu zawieść, rozsądnie jest przynajmniej wysłać wiadomość e-mail na podany adres e-mail z informacją, że ich adres e-mail nie został znaleziony. To 1) uniemożliwia atakującym masowe nadużywanie systemu (jak można zauważyć) oraz 2) zapobiega zastanawianiu się przez użytkowników, dlaczego nie otrzymują wiadomości e-mail.

2: Czy zwróć uwagę, że ograniczenie prędkości może negatywnie wpłynąć na użytkowników dużych sieci lub VPN. Zawsze rozważ, jak ważna jest dla Ciebie ta publiczność i na tej podstawie poświęć odpowiednią ilość czasu, aby aplikacja działała nawet wtedy, gdy ograniczenie szybkości jest najsurowsze (np. Poprzez obniżenie limitu szybkości przez rozwiązanie captcha lub ustawienie maksymalnego limitu szybkości na około raz na minutę i upewnienie się, że aplikacja będzie czekała pełną minutę (uwaga: nadal będzie nieprzyjemne, biorąc pod uwagę zespół użytkowników rejestrujących się w tej samej usłudze na początku tego samego spotkania)).

Czy nie byłoby w porządku w ten sposób: „Wysłano do Ciebie e-mail z prośbą o kontynuację rejestracji, jeśli jesteś już zarejestrowany, nie otrzymasz e-maila.”Uniemożliwiłoby to atakującemu spamowanie znanego mu adresu e-mail.
@SAJW Myślę, że to, co opisujesz, jest takie samo, jak opisałem, gdy napisałem „Biorąc pod uwagę nawet niewielkie ryzyko, rozsądnie może być zmiana formularza rejestracyjnego, aby rozpocząć od wpisania tylko nazwiska i adresu e-mail, dając wiadomość” sprawdź swój e-mail dokontynuuj rejestrację „”.Ale jeśli masz pomysł, jak uczynić to jaśniejszym lub lepszym: możesz edytować
Ah nie ważne.Twoja droga jest wystarczająca, ponieważ jeśli napastnik zna Twój adres e-mail, może Cię spamować, jeśli NIE jesteś zarejestrowany, więc nie zyskamy wiele dzięki mojemu rozwiązaniu.
@SAJW W jakiś sposób kompletnie źle odczytałem twój komentarz i teraz jest krystalicznie czysty….Ale tak, generalnie cicha awaria jest bardzo niebezpieczna, ponieważ użytkownik nigdy nie wie, czy jakiś powolny serwer pocztowy lub filtr spamu przechwycił jego e-mail, czy też faktycznie powinien nie otrzymać e-maila.
Džuris
2020-03-20 07:05:59 UTC
view on stackexchange narkive permalink

Należy rozważyć problem w porównaniu z niedogodnością rozwiązania. Często jest to kompromis.

Moim zdaniem zwykle lepiej jest poświęcić tę odrobinę bezpieczeństwa dla wygody użytkownika, chyba że ktoś mógłby zostać prześladowany za zarejestrowanie się w Twojej witrynie.

Od czasu do czasu po latach przechodzę do witryny i próbuję dowiedzieć się, jakiego adresu e-mail użyłem w tej witrynie. Witryny, które ukrywają te informacje, są dość denerwujące.

Świetny dodatek do innych odpowiedzi.Każda funkcja bezpieczeństwa powinna zostać oceniona pod kątem bieżącego kontekstu, aby zdecydować, czy jej koszty są opłacalne.Odpowiedź nie zawsze brzmi „tak”.
W przypadku, gdy nie wiem, którego adresu e-mail użyłem, często wyszukuję nazwę witryny za pomocą moich głównych adresów e-mail, aby sprawdzić, z którym się zarejestrowałem.Szczególnie przydatna w połączeniu z funkcją Google polegającą na dodaniu + czegokolwiek do adresu e-mail.
Nie chodzi tylko o prześladowania, ale także o phishing.Wyobraź sobie, że ktoś otrzymuje wiadomość e-mail „resetowanie hasła”, a 5 minut później otrzymał wiadomość, która najwyraźniej pochodzi z Twojej witryny, mówiącą: „Rozpoznaliśmy login / zakup z Twojego konta, który może nie pochodzić od Ciebie.czy Twoje konto zostało przejęte ”.Wiele osób zaloguje się na oszukańczej witrynie, ponieważ wiadomość e-mail zresetowania przygotowała ich do tego, a oszust wie, że dana osoba ma u Ciebie konto, więc może sformatować wiadomość inaczej niż w zwykłej wiadomości spamowej.
@Morfildur: Większość phisherów nie zawraca sobie głowy sprawdzaniem istnienia konta przed wysłaniem wiadomości e-mail.Dlatego otrzymujesz e-maile phishingowe dotyczące usług, z których nie korzystasz.
eckes
2020-03-21 09:42:52 UTC
view on stackexchange narkive permalink

Zauważ, że to również (poza innymi odpowiedziami) dotyczy ekranu rejestracji, zamiast narzekać na już zarejestrowanego użytkownika, wysłał mu e-mail, że jest już zarejestrowany i nie przekazuje żadnej opinii na ten temat w aplikacji internetowej poza „sprawdź pocztę ”.

Najlepiej jest to zrobić, jeśli w pierwszym kroku przed weryfikacją adresu e-mail poprosisz o minimum danych wejściowych (co jest również dobre dla RODO, gdzie możesz udowodnić, że użytkownik otrzymał Twój e-mail informacyjny i kontynuował rejestrację ).

W rzeczywistości nie jest to kłopotliwe przy rejestracji i zawsze powinno być robione. W przypadku funkcji resetowania hasła udostępniamy opcję w oprogramowaniu, w której można wybrać bezpośrednią opinię lub opinię e-mail. (W scenariuszach korporacyjnych, zwłaszcza w intranecie, odgadywanie e-maili nie jest prawdziwym zagrożeniem).



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 4.0, w ramach której jest rozpowszechniana.
Loading...