1. #1
    Avatar von Linux
    Registriert seit
    02.11.2018
    Beiträge
    6
    Thanked 1 Time in 1 Post

    Standard

    Hallo,
    meine HTTP-Anfragen liefern immer 403 Forbidden Fehler. Ob ich curl oder wget benutze, macht keinen Unterschied. Woran liegt das, wie kann ich es lösen?

  2. #2
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.081
    Thanked 9.119 Times in 2.996 Posts
    Blog Entries
    5

    Standard

    Funktioniert der Zugriff auf die jeweilige Seite im Browser, fehlt wahrscheinlich etwas in deiner Anfrage, die du mit wget/curl sendest. In den meisten Fällen eines oder mehrere der folgenden Dinge. Zur Ermittlung mancher Werte kann es hilfreich sein, die Anfrage einmal im Browser durchzuführen und mit den Entwicklertools (F12) die Header anzuschauen, welche der Browser sendet.



    User-Agent
    Enthält Informationen über deinen Browser und das Betriebssystem, auf dem er läuft. Dieser Header ist zwar optional. Aber manche Seiten prüfen ihn und erlauben/verbieten bestimmte User-Agenten. Standardmäßig sendet curl hier "curl/7.64.0" mit entsprechender Version, sodass die Seiten leicht prüfen können ob z.B. curl darin vor kommt und die Anfragen dann ablehnen.

    Um das zu lösen, sendet man einen echten User-Agenten eines Browsers: Zum Beispiel whatmyuseragent.com aufrufen, der User-Agent kopieren und in curl wie folgt setzen
    Code:
    curl -A "Mozilla/5.0 (X11; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0" "https://u-labs.de"
    Referer
    Dieser Header enthält die Herkunftsseite, beispielsweise bei Klicks auf einen Link. Wie der User-Agent ist auch dieser Header optional. Manche Seiten prüfen ihn aber und erlauben nur bestimmte Seiten. Am einfachsten schaut man in der Browserkonsole, was als Referer Header gesetzt ist und übergibt dies an curl:

    Code:
    curl --referer "https://u-labs.de/forum" "https://u-labs.de"
    Anmeldung/Autorisierung
    Sind bestimmte Inhalte nur für angemeldete Benutzer verfügbar, gibt es zwei Möglichkeiten:
    1. Basic-Authentifizierung
    Sofern es die Seite unterstützt, können wir einfach --user benutzername:passwort übergeben.
    2. Login-Anfrage senden
    Alternativ müssen wir die (i.d.R. POST) Abfrage zum Logik absenden, die Cookies speichern und für unsere Anfrage wiederverwenden (siehe unten).

    Cookies/Sitzungen
    Teils werden auch bestimmte Cookies benötigt. Dies können statische Cookies sein, aber auch Sitzungen. Letztere meist eingeloggt, teils auch auch ohne. Einzelne Cookies können mit --cookie a=b übergeben werden. Falls wir einen Login brauchen, ermitteln wir im Browser welche Formularfelder gesendet werden müssen und speichern die Cookies:
    Code:
    curl -c cookie.txt curl -X POST -F 'user=test' -F 'password=123' https://example.com/login
    Anschließend kann man die gewünschte Anfrage durchführen. Durch --load-cookies werden die zuvor gespeicherten Cookies geladen:
    Code:
    curl -b cookie.txt https://example.com
    Man erspart sich hierbei das händische Parsen und Speichern - curl erledigt dies automatisch und sendet beim -b Schalter alle gespeicherten Cookies mit.

    Weitere Tipps
    Das sind die gängigsten Probleme, die bei curl Anfragen auftreten und einen 403 Fehler erzeugen können. Sollte die Anfrage dennoch nicht funktionieren, empfehle ich einen Vergleich der Header von curl mit denen des Browsers. Dazu folgende Parameter nutzen:
    Code:
    curl -s -D - -o /dev/null https://u-labs.de
    Als Ergebnis erhalten wir nur die Header, die curl sendet, ohne den (oft sehr langen) Body. Alternativ werden diese auch im Verbose Modus mit -v angezeigt. Allerdings erhält man dabei auch viele Debug-Ausgaben von anderen Komponenten, wie z.B. SSL Handshakes usw. Deswegen würde ich die erste Variante bevorzugen, da sie übersichtlicher ist und sich nur auf den gesendeten HTTP-Header konzentriert.

    Falls weitere Header gesetzt werden müssen, kann man dies mit -H name:Wert an curl weitergeben.

  3. The Following 2 Users Say Thank You to DMW007 For This Useful Post:

    Darkfield (13.08.2021), Linux (13.08.2021)

  4. #3
    Avatar von Linux
    Registriert seit
    02.11.2018
    Beiträge
    6
    Thanked 1 Time in 1 Post

    Standard

    Bei der Seite die ich aufrufen wollte, wurde anscheinend curl als Useragent blockiert. Alles andere hat funktioniert, selbst wenn ich dort nur Chrome oder Firefox rein schreibe (also nur das Wort, ohne den richtigen String von den Browsern). Danke für die ausführliche Antwort :)

Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.