dlaczego zawinięcie i wget spowoduje 403 zabronione?


57

Próbuję pobrać plik za pomocą wgeti curli jest on odrzucany z błędem 403 (zabronione).

Mogę wyświetlić plik za pomocą przeglądarki internetowej na tym samym komputerze.

Próbuję ponownie z klientem przeglądarki, uzyskanym przez http://www.whatsmyuseragent.com . Robię to:

wget -U 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

i

curl -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

ale nadal jest zabronione. Jakie mogą być inne powody dla 403 i w jaki sposób mogę zmienić polecenia wgeti curl, aby je pokonać?

(nie chodzi o to, że mogę pobrać plik - wiem, że mogę go zapisać w przeglądarce; chodzi o zrozumienie, dlaczego narzędzia wiersza poleceń działają inaczej)

aktualizacja

Dzięki wszystkim doskonałym odpowiedziom udzielonym na to pytanie. Konkretny problem, jaki napotkałem, polegał na tym, że serwer sprawdzał stronę odsyłającą. Dodając to do wiersza poleceń, mógłbym pobrać plik za pomocą curli wget.

Serwer, który sprawdził odsyłającą odesłana przez 302 do innego miejsca, które wykonaliśmy żadnych kontroli w ogóle, a więc curlalbo wgeto tym miejscu pracował równo.

Jeśli ktoś jest zainteresowany, stało się tak, ponieważ czytałem stronę, aby dowiedzieć się o wbudowanym CSS i próbowałem spojrzeć na css witryny na przykład. Rzeczywisty adres URL, z którym miałem problem, był taki, a curlskończyło się na nim

curl -L -H 'Referer: http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

a wget jest

 wget --referer='http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

Bardzo interesujące.


7
Strony sprawdzające odsyłacz są naprawdę denerwujące. Nagłówek ma być opcjonalny i służy do zbierania statystyk.
zaadeh

Najłatwiejszą rzeczą, jaką znalazłem, jest przekonwertowanie go na plik zip i użycie go w ten sposób.
piniyini,

Odpowiedzi:


40

Żądanie HTTP może zawierać więcej nagłówków, które nie są ustawione przez zawinięcie lub wget. Na przykład:

  • Cookie: jest to najbardziej prawdopodobny powód odrzucenia wniosku. Widziałem to na stronach pobierania. Biorąc pod uwagę plik cookie key=val, możesz ustawić go za pomocą opcji -b key=val(lub --cookie key=val) dla curl.
  • Odsyłacz (sic): po kliknięciu łącza na stronie internetowej większość przeglądarek zwykle wysyła bieżącą stronę jako odsyłacz. Nie należy na nim polegać, ale nawet eBay nie zresetował hasła, gdy ten nagłówek był nieobecny. Tak, może się zdarzyć. curlOpcja ta jest -e URLi --referer URL.
  • Autoryzacja: obecnie staje się coraz mniej popularna z powodu niekontrolowanego interfejsu użytkownika w oknie dialogowym nazwa użytkownika / hasło, ale nadal jest możliwa. Można go ustawić za curlpomocą opcji -u user:password(lub --user user:password).
  • User-Agent: niektóre żądania przyniosą różne odpowiedzi w zależności od User-Agent. Można to wykorzystać w dobry sposób (zapewniając rzeczywiste pobieranie zamiast listy kopii lustrzanych) lub w zły sposób (odrzuć aplikacje klienckie, które nie zaczynają się Mozilla, nie zawierają Wgetlub curl).

Zwykle można użyć narzędzi programistycznych przeglądarki (Firefox i Chrome obsługują to), aby odczytać nagłówki wysłane przez przeglądarkę. Jeśli połączenie nie jest szyfrowane (tzn. Nie używa HTTPS), możesz również użyć do tego celu sniffera pakietów, takiego jak Wireshark.

Oprócz tych nagłówków strony internetowe mogą również wyzwalać pewne działania za kulisami, które zmieniają stan. Na przykład podczas otwierania strony możliwe jest wykonanie żądania w tle w celu przygotowania łącza pobierania. Lub przekierowanie dzieje się na stronie. Te działania zwykle wykorzystują JavaScript, ale może również istnieć ukryta ramka, aby ułatwić te akcje.

Jeśli szukasz metody łatwego pobierania plików z witryny pobierania, zapoznaj się z pługiem dołączonym do lemiesz .


Inną naprawdę przewrotną możliwością byłoby skonfigurowanie serwera z jakiegoś powodu tak, aby zwracał 403 zamiast 200 po sukcesie.
kasperd

1
To dało mi wskazówkę, której potrzebowałem. Po wypróbowaniu ciasteczek odkryłem, że odsyłający jest problemem (teraz, jeśli tylko można to poprawnie przeliterować !!!)
starfry

2
Jeśli jest nadal nie w wgetpróbie dodania --auth-no-challenge. Działa jak magia.
Jonathan

13

Po prostu chcesz dodać do powyższych odpowiedzi, że możesz użyć funkcji „Kopiuj jako cURL” dostępnej w narzędziach programistycznych Chrome (od wersji 26.0) i Firebug (od wersji 1.12 ). Dostęp do tej funkcji można uzyskać, klikając prawym przyciskiem myszy wiersz żądania na karcie Sieć.


To ogromnie pomogło, zwłaszcza w narzędziach Chrome. Kiedy próbowałem w Firefoksie, nagłówek żądania po 302 był wszystkim, co mogłem zobaczyć. W Chromium widziałem oba te elementy, co dało mi informacje do rozwiązania problemu.
starfry

1
@starfry Musisz zaznaczyć Enable persistent logszakładkę ustawień narzędzi programistycznych Firefoksa, aby zapobiec usuwaniu dzienników sieciowych po przekierowaniu. Chrome ma podobną opcję. Nawiasem mówiąc, „Kopiuj jako cURL” jest już od jakiegoś czasu w Firefoksie Nightly / Aurora / Beta i ma się ukazać w kolejnej dużej wersji (31.0).
Bob

9

Próbowałem wszystkich powyższych, jednak bez powodzenia; użyłem narzędzia przeglądarki dev, aby pobrać ciąg user-agent, gdy dodałem następujące, sukces:

--user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"

5

W zależności od tego, o co prosisz, może to być plik cookie. W przeglądarce Firefox możesz kliknąć prawym przyciskiem myszy na wyświetlonej stronie „Wyświetl informacje o stronie”. Wybierz ikonę „Bezpieczeństwo”, a następnie kliknij przycisk „Wyświetl pliki cookie”.

Do rozwiązywania problemów związanych z plikami cookie niezbędna jest wtyczka „Live HTTP Headers” do przeglądarki Firefox. Możesz zobaczyć, jakie pliki cookie są ustawiane i jakie pliki cookie są wysyłane z powrotem na serwer internetowy.

wgetmoże pracować z plikami cookie, ale jest to całkowicie irytujące, ponieważ nie daje wskazówki, że nie wysłał plików cookie. Najlepiej jest usunąć wszystkie powiązane pliki cookie z przeglądarki i przejść przez dowolną początkową procedurę logowania lub sekwencję przeglądania stron. Sprawdź „Nagłówki HTTP na żywo”, aby znaleźć pliki cookie i parametry POST lub GET. Wykonaj pierwszy krok logowania przy wgetużyciu opcji „--keep-session-cookies” i „--save-cookies”. Otrzymasz plik cookie, który możesz przeglądać za pomocą edytora tekstu. Użyj wget --load-cookiesz plikiem cookie w kolejnych krokach.


1
Testowałem bez plików cookie w przeglądarce Firefox, otwierając prywatne okno przeglądania i, zgodnie z oczekiwaniami, otrzymałem błąd 403. Interesujące, że nie pojawia się błąd w nowej karcie. W Chromium nowa karta zwraca 403.
starfry

1
Nawiasem mówiąc, możesz użyć karty sieciowej narzędzi programistycznych Firefoksa, aby sprawdzić wysłane i otrzymane pliki cookie bez żadnych dodatków. Ditto dla Chrome / Chromium.
Bob

@ Bob - tak, znalazłem to. Zajęło mi to kilka minut, ponieważ to nie było coś. Firebug ma teraz opcję Kopiuj jako CURL, ale fajnie byłoby zobaczyć także natywne narzędzia.
starfry

1

Innym powodem może być to, że witryna wymaga protokołu SSL. Twoja przeglądarka automatycznie przekieruje z HTTP na HTTPS, ale curl i wget nie. Wypróbuj więc żądanie za pomocą HTTPS zamiast HTTP.


3
To kończy się błędem 301 lub 302, Przekierowanie, jeśli mam rację.
Jakuje
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.