warum sollte sich eine 403 kräuseln und wget dazu führen, dass sie verboten ist?

57

Ich versuche, eine Datei mit wgetund herunterzuladen curlund sie wird mit einem 403-Fehler abgelehnt (verboten).

Ich kann die Datei mit dem Webbrowser auf demselben Computer anzeigen.

Ich versuche es erneut mit dem User Agent meines Browsers, der von http://www.whatsmyuseragent.com bezogen wird . Ich mache das:

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

und

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

aber es ist immer noch verboten. Welche anderen Gründe könnte es für den 403 geben, und wie kann ich die Befehle wgetund ändern curl, um sie zu überwinden?

(Hier geht es nicht darum, die Datei abrufen zu können. Ich weiß, dass ich sie einfach in meinem Browser speichern kann. Es geht darum, zu verstehen, warum die Befehlszeilentools anders funktionieren.)

aktualisieren

Vielen Dank an alle hervorragenden Antworten auf diese Frage. Das spezifische Problem, auf das ich gestoßen war, war, dass der Server den Referrer überprüfte. Indem ich dies zur Kommandozeile hinzufüge, könnte ich die Datei mit curlund erhalten wget.

Der Server, der den Referrer überprüft hat, ist über einen 302 an einen anderen Standort gestoßen, an dem überhaupt keine Überprüfungen durchgeführt wurden, sodass ein curloder wgetdieser Standort ordnungsgemäß funktioniert hat.

Wenn jemand interessiert ist, ist dies darauf zurückzuführen, dass ich diese Seite gelesen habe, um etwas über eingebettetes CSS zu erfahren, und versucht habe, das CSS der Site als Beispiel zu betrachten. Die eigentliche URL, mit der ich Probleme hatte, war diese und die curl, mit der ich gelandet bin, ist

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

und der wget ist

 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

Sehr interessant.

starfry
quelle
7
Seiten, die Verweise überprüfen, sind wirklich ärgerlich. Der Header soll optional sein und zum Sammeln von Statistiken verwendet werden.
Zaadeh
Ich habe festgestellt, dass es am einfachsten ist, es in eine Zip-Datei zu konvertieren und auf diese Weise zu verwenden.
piniyini

Antworten:

40

Eine HTTP-Anfrage kann mehrere Header enthalten, die nicht durch curl oder wget festgelegt wurden. Zum Beispiel:

  • Cookie: Dies ist der wahrscheinlichste Grund, warum eine Anfrage abgelehnt wird. Ich habe gesehen, dass dies auf Download-Sites passiert. Wenn Sie ein Cookie erhalten haben key=val, können Sie es mit der Option -b key=val(oder --cookie key=val) für festlegen curl.
  • Referer (sic): Wenn Sie auf einen Link auf einer Webseite klicken, tendieren die meisten Browser dazu, die aktuelle Seite als Referrer zu versenden. Man sollte sich nicht darauf verlassen, aber selbst eBay konnte ein Passwort nicht zurücksetzen, wenn dieser Header nicht vorhanden war. Also ja, es kann passieren. Die curlOption hierfür ist -e URLund --referer URL.
  • Autorisierung: Aufgrund der unkontrollierbaren Benutzeroberfläche des Dialogfelds "Benutzername / Kennwort" wird dies immer weniger beliebt, ist jedoch weiterhin möglich. Dies kann curlmit der Option -u user:password(oder --user user:password) eingestellt werden.
  • User-Agent: Bei einigen Anforderungen werden je nach User-Agent unterschiedliche Antworten ausgegeben. Dies kann auf eine gute Art und Weise (Bereitstellung des tatsächlichen Downloads anstelle einer Liste von Spiegeln) oder auf eine schlechte Art und Weise (Zurückweisen von Benutzeragenten, die nicht mit Mozillaoder beginnen Wgetoder oder enthalten curl) verwendet werden.

Normalerweise können Sie die Entwicklertools Ihres Browsers verwenden (Firefox und Chrome unterstützen dies), um die von Ihrem Browser gesendeten Header zu lesen. Wenn die Verbindung nicht verschlüsselt ist (dh kein HTTPS verwendet), können Sie zu diesem Zweck auch einen Paketsniffer wie Wireshark verwenden.

Neben diesen Kopfzeilen können Websites auch Aktionen hinter den Kulissen auslösen, die den Status ändern. Wenn Sie beispielsweise eine Seite öffnen, wird möglicherweise eine Anforderung im Hintergrund ausgeführt, um den Download-Link vorzubereiten. Oder eine Weiterleitung findet auf der Seite statt. Bei diesen Aktionen wird in der Regel Javascript verwendet, es kann jedoch auch einen verborgenen Rahmen geben, um diese Aktionen zu vereinfachen.

Wenn Sie nach einer Methode suchen , um auf einfache Weise Dateien von einer Download - Site zu holen, hat einen Blick auf plowdown, mit inbegriffen plowshare .

Lekensteyn
quelle
Eine andere wirklich perverse Möglichkeit wäre, dass der Server aus irgendeinem Grund so konfiguriert wurde, dass er bei Erfolg 403 statt 200 zurückgibt.
Kasperd
1
Das gab mir den Hinweis, den ich brauchte. Nachdem ich Cookies ausprobiert hatte, stellte ich fest, dass der Referrer das Problem war (nun, wenn das nur richtig geschrieben werden könnte !!!)
vom
2
Wenn es immer noch Fehler in wgetversuchen Sie --auth-no-challenge. Funktioniert wie Magie.
Jonathan
13

Fügen Sie zu den obigen Antworten hinzu, dass Sie die Funktion "Als cURL kopieren" in den Chrome-Entwicklertools (seit v26.0) und in Firebug (seit v1.12 ) verwenden können. Sie können auf diese Funktion zugreifen, indem Sie auf der Registerkarte Netzwerk mit der rechten Maustaste auf die Anforderungszeile klicken.

solde9
quelle
Dies hat immens geholfen, insbesondere die Tools in Chrome. Als ich es in Firefox versuchte, war der Anforderungsheader nach dem 302 alles, was ich sehen konnte. In Chromium konnte ich beides sehen und das gab mir die Info, um das Problem zu lösen.
Starfry
1
@starfry Sie müssen Enable persistent logsdie Registerkarte "Einstellungen" der Firefox- Entwicklungstools ankreuzen , um zu verhindern, dass Netzwerkprotokolle bei einer Umleitung gelöscht werden . Chrome hat eine ähnliche Option. "Copy as cURL" ist übrigens schon eine Weile in Firefox Nightly / Aurora / Beta und wird voraussichtlich in der nächsten Hauptversion (31.0) veröffentlicht.
Bob
9

Versuchte das alles aber kein Glück; Ich habe das Dev-Browser-Tool verwendet, um die User-Agent-Zeichenfolge abzurufen, nachdem ich Folgendes hinzugefügt habe:

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

Je nachdem, wonach Sie fragen, kann es sich um ein Cookie handeln. Mit Firefox können Sie mit der rechten Maustaste auf die betreffende Seite "Seiteninformationen anzeigen" klicken. Wählen Sie das Symbol "Sicherheit" und klicken Sie auf die Schaltfläche "Cookies anzeigen".

Zum Verwirren von Cookies ist das Firefox-Plug-In "Live HTTP Headers" erforderlich. Sie können sehen, welche Cookies gesetzt und welche Cookies an den Webserver zurückgesendet werden.

wgetkann mit Cookies arbeiten, ist aber total ärgerlich, da es keinen Hinweis darauf gibt, dass keine Cookies gesendet wurden. Am besten entfernen Sie alle zugehörigen Cookies aus Ihrem Browser und durchlaufen die anfängliche Anmeldung oder die Reihenfolge der Seitenanzeige. Unter "Live-HTTP-Header" finden Sie Informationen zu Cookies und zu POST- oder GET-Parametern. wgetFühren Sie den ersten Anmeldeschritt mit den Optionen "--keep-session-cookies" und "--save-cookies" aus. Dadurch erhalten Sie eine Cookie-Datei, die Sie mit einem Texteditor anzeigen können. Verwenden Sie wget --load-cookiesmit der Cookie - Datei für die nächsten Schritte.

Bruce Ediger
quelle
1
Ich habe in Firefox ohne Cookies getestet , indem ich ein privates Browserfenster geöffnet habe und wie erwartet den Fehler 403 erhalten habe. Interessant, dass der Fehler nicht in einem neuen Tab angezeigt wird. In Chrom gibt ein neuer Tab den
Wert
1
Übrigens können Sie die Registerkarte "Netzwerk" der Firefox-Entwicklungstools verwenden, um gesendete und empfangene Cookies ohne Addons zu überprüfen. Das Gleiche gilt für Chrome / Chromium.
Bob
@bob - ja das habe ich gefunden. Es hat ein paar Minuten gedauert, da es nichts war. Firebug hat jetzt Copy as CURL, aber es wäre schön, wenn es auch die nativen Tools sehen würde.
Starfry
1

Ein weiterer Grund dafür kann sein, dass für die Site SSL erforderlich ist. Ihr Browser leitet automatisch von HTTP zu HTTPS weiter, Curl und Wget jedoch nicht. Versuchen Sie also die Anfrage mit HTTPS anstelle von HTTP.

Richard
quelle
3
Dies würde in Fehler 301 oder 302 enden, umleiten, wenn ich recht habe.
Jakuje