Quelltext Webseite schlägt noch immer fehl

C

cheat.008

Aktives Mitglied
Folgender Code verweigert mir bei einer bestimmten Webseite noch immer das Holen des Quelltextes.
Wie kann ich weiter dahinter kommen als den HTTP Fehler 403 woran das liegen kann?
Noch jemand Vorschläge für die Fehlersuche?

Code:
public class QuelltextReader
{
   public static void main(String[] args) throws Exception
   {
       URL url = new URL("meineWebseite");
       URLConnection connection = url.openConnection();
       connection.addRequestProperty("User-Agent",   "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0");
       connection.connect();
       BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

       String input;
       while ((input = in.readLine()) != null)
           System.out.println(input);
       in.close();
   }
}

Code:
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: www.meineWebseite.de
   at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
   at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
   at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
   at privat.HeaderReader.main(QuelltextReader.java:16)
 
truesoul

truesoul

Top Contributor
Es ist nicht "www.meinewebsite.de". Es ist einfach eine https Website.

Die Frage ist, gibt es eine Möglichkeit näheres rauszufinden zu dem Grund, warum der Webserver die Anfrage ablehnt (aufgrund fehlender Berechtigung ist ja sehr "breit").

Diese Information wäre anfangs vielleicht auch ganz gut gewesen ;)

Ist ein Login notwendig? Oder greifst du evtl. nur auf der Landingpage zu?

Mehr Infos wären gut :)
 
Robat

Robat

Top Contributor
Vielleicht klappt es ja über den Authenticator.
Java:
Authenticator.setDefault (new Authenticator() {
   protected PasswordAuthentication getPasswordAuthentication() {
       return new PasswordAuthentication ("username", "password".toCharArray());
   }
});
 
C

cheat.008

Aktives Mitglied
Vielleicht klappt es ja über den Authenticator.
Java:
Authenticator.setDefault (new Authenticator() {
   protected PasswordAuthentication getPasswordAuthentication() {
       return new PasswordAuthentication ("username", "password".toCharArray());
   }
});

Leider nein. Selbige Exceptionausgabe.
Werde mal in die Richtung Login recherchieren. Dürft mir aber gerne noch Tipps geben ;-)
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Ziemlich sicher dürfte das ein Login sein, der die Session in'nem Cookie speichert.
Du müsstest sowohl den Login (also Request mit Name, Passwort etc) als auch die entsprechende Behandlung von Cookies abbilden.
 
mihe7

mihe7

Top Contributor
Der Web-Entwickler hat verschiedene Möglichkeiten, Login und Session zu realisieren. Klassisch wären Session-Cookie und ein HTML-Formular, mit dem Benutzername und Passwort via POST-Request an den Server gesendet werden.

Für die Cookies:
https://docs.oracle.com/javase/8/docs/api/java/net/CookieHandler.html
https://docs.oracle.com/javase/8/docs/api/java/net/CookieManager.html

Vor den Requests sollte also folgendes genügen:
Java:
CookieHandler.setDefault(new CookieManager());

Für den Login sendest Du, wenn wir von einem HTML-Formular ausgehen, einfach einen POST-Request, wobei die Formularfelder URL-kodiert (Content-Type "application/x-www-form-urlencoded") übermittelt werden. Stichworte sind HttpURLConnection und URLEncoder. Das sollte jetzt nicht allzu schwierig sein.
 
C

cheat.008

Aktives Mitglied
Ok danke für den Ansatz.
Das sind einige neue Dinge für mich, die ich die Tage mal recherchieren und testen werde.

Also den Login als Fehlerquelle kann ich derzeit ausschließen, da selbst das holen von Daten vor dem Login mit genanntem 403 Fehler fehlschlägt. Daher werde ich bei zukünftigen Verbindungsversuchen zunächst eine Seite vor dem Login zu holen versuchen.


Ich melde mich wieder wenn es Neuigkeiten oder Probleme gibt.
 
C

cheat.008

Aktives Mitglied
Also den Login als Fehlerquelle kann ich derzeit ausschließen, da selbst das holen von Daten vor dem Login mit genanntem 403 Fehler fehlschlägt. Daher werde ich bei zukünftigen Verbindungsversuchen zunächst eine Seite vor dem Login zu holen versuchen.

Natürlich Quatsch, sorry.
Das Holen der Quelltextdaten VOR dem Login funktioniert.


Habe nun zum Thema POST Request in der Insel nachgelesen:
http://openbook.rheinwerk-verlag.de...21_004.htm#mj09ddf4c4d29f03c1fa3ffe5344c0875d

Der Code sieht nun folgendermaßen aus.
Ergebnis noch immer der gleiche 403 Fehler. Scheint also noch immer
am Login zu scheitern.

Code:
...
   public static void main(String[] args) throws Exception
   {
       String body = "param1=" + URLEncoder.encode("<username>", "UTF-8") + "&" + "param2="
               + URLEncoder.encode("<passwort>", "UTF-8");

       CookieHandler.setDefault(new CookieManager());
       URL url = new URL("<website>");
       HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();

       connection.setRequestMethod("POST");
       connection.setDoInput(true);
       connection.setDoOutput(true);
       connection.setUseCaches(false);
       connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
       connection.setRequestProperty("Content-Length", String.valueOf(body.length()));
       connection.addRequestProperty("User-Agent",
               "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0");
       connection.connect();

       BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

       String input;
       while ((input = in.readLine()) != null)
           System.out.println(input);
       in.close();
   }
}
 

Anhänge

  • login.JPG
    login.JPG
    19,6 KB · Aufrufe: 78
Zuletzt bearbeitet:
mihe7

mihe7

Top Contributor
1. Heißen die Form-Elemente auf der Webseite wirklich param1 und param2?
2. Du musst den body schon über den OutputStream der connection rausschreiben.
 
mihe7

mihe7

Top Contributor
Nehmen wir mal an, wir fänden unter www.meinewebseite.de/login.html folgenden Code

HTML:
<form method="POST" action="login.php">
  <input type="text" name="benutzer" />
  <input type="password" name="vorbeiwort" />
  <button type="submit">OK</button>
</form>

Dann würde beim Klick auf den Button ein POST-Request www.meinewebseite.de/login.php ausgeführt. Der Body wäre dann "benutzer=xxx&vorbeiwort=xxx".
 
C

cheat.008

Aktives Mitglied
1. Heißen die Form-Elemente auf der Webseite wirklich param1 und param2?
2. Du musst den body schon über den OutputStream der connection rausschreiben.


Ah, vergessen. Nein die Namen sind "login" und "password".
Danke!
Leider kenne ich mich mit HTML/PHP nicht sonderlich gut aus.

Code:
public class QuelltextReader
{
   public static void main(String[] args) throws Exception
   {
       String body = "login=" + URLEncoder.encode("<meinUN>", "UTF-8") + "&" + "password="
               + URLEncoder.encode("<meinPW>", "UTF-8");

       CookieHandler.setDefault(new CookieManager());
       URL url = new URL("<website>");
       HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
       connection.setRequestMethod("POST");
       connection.setDoInput(true);
       connection.setDoOutput(true);
       connection.setUseCaches(false);
       connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
       connection.setRequestProperty("Content-Length", String.valueOf(body.length()));
       connection.addRequestProperty("User-Agent",
               "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0");
       connection.connect();

       OutputStreamWriter osw = new OutputStreamWriter( connection.getOutputStream() );
       osw.write(body);
       osw.flush();
     
       BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

       String input;
       while ((input = in.readLine()) != null)
           System.out.println(input);
       in.close();
   }
}
 
C

cheat.008

Aktives Mitglied
Nehmen wir mal an, wir fänden unter www.meinewebseite.de/login.html folgenden Code

HTML:
<form method="POST" action="login.php">
  <input type="text" name="benutzer" />
  <input type="password" name="vorbeiwort" />
  <button type="submit">OK</button>
</form>

Dann würde beim Klick auf den Button ein POST-Request www.meinewebseite.de/login.php ausgeführt. Der Body wäre dann "benutzer=xxx&vorbeiwort=xxx".

Durch den OutputStream sende ich im "body" die Logininformationen.
Impliziert das dann sozusagen das "Betätigen" des Buttons?
 
mihe7

mihe7

Top Contributor
Wenn Du das HTML von vorhin nimmst, dann sendet der Browser beim Betätigen des Buttons eben einen solchen Request.

Funktioniert es jetzt? Wenn nicht, wie sieht die Antwort bzw. wie sehen die Response-Header aus?
 
C

cheat.008

Aktives Mitglied
Wenn Du das HTML von vorhin nimmst, dann sendet der Browser beim Betätigen des Buttons eben einen solchen Request.

Also es gibt ja tatsächlich auf der Seite einen Anmelde-Button.
Verstehe ich das richtig, dass ich durch den "body"-String bzw. POST-Request
aktuell nur die Felder "login" und "password" fülle, aber das Betätigen des genannten Buttons noch fehlt?
Falls ja, müsste ich das ja noch in meinen Code implementieren...

Der Button:
Code:
<input class="button primary" value="Anmelden" data-loginphrase="Anmelden" data-signupphrase="Registrieren" tabindex="4" type="submit">

Funktioniert es jetzt? Wenn nicht, wie sieht die Antwort bzw. wie sehen die Response-Header aus?

Leider nein.
Kannst du damit etwas anfangen?

Code:
Printing Response Header...

Key : Transfer-Encoding ,Value : [chunked]
Key : null ,Value : [HTTP/1.1 403 Forbidden]
Key : CF-RAY ,Value : [42bcb0a3be939720-FRA]
Key : Server ,Value : [cloudflare]
Key : Connection ,Value : [keep-alive]
Key : Last-Modified ,Value : [Sat, 16 Jun 2018 10:45:59 GMT]
Key : Date ,Value : [Sat, 16 Jun 2018 10:45:59 GMT]
Key : X-Frame-Options ,Value : [SAMEORIGIN]
Key : X-Xss-Protection ,Value : [1]
Key : Vary ,Value : [Accept-Encoding]
Key : Set-Cookie ,Value : [, ]
Key : Expires ,Value : [Thu, 19 Nov 1981 08:52:00 GMT]
Key : Expect-CT ,Value : [max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"]
Key : Cache-control ,Value : [private, max-age=0]
Key : Content-Type ,Value : [text/html; charset=UTF-8]
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    22,7 KB · Aufrufe: 122
Zuletzt bearbeitet:
mihe7

mihe7

Top Contributor
1. Du sendest den Request schon gegen die URL, die sich aus dem action-Attribut der Form ergibt?
2. Falls ja: es kann auch sein, dass die Seite die Anmeldung via JavaScript realisiert und es z. B. gar keine serverseitigen Sessions gibt (dann existiert die Session nur auf dem Client und die Authorisierung erfolgt durch ein Token, z. B. via JWT)
3. Ohne Infos zur Seite ist das ein reines Rätselraten
 
C

cheat.008

Aktives Mitglied
1. Du sendest den Request schon gegen die URL, die sich aus dem action-Attribut der Form ergibt?

Ja

2. Falls ja: es kann auch sein, dass die Seite die Anmeldung via JavaScript realisiert und es z. B. gar keine serverseitigen Sessions gibt (dann existiert die Session nur auf dem Client und die Authorisierung erfolgt durch ein Token, z. B. via JWT)
3. Ohne Infos zur Seite ist das ein reines Rätselraten

Ja du hast schon recht, hatte mir das alles einfacher vorgestellt und für weiteres reichen meine HTML Kenntnisse leider nicht aus, daher werde ich mir was anderes überlegen müssen.
Danke für deine Hilfe bis hierher!
 
mihe7

mihe7

Top Contributor
Das ist alles kein Hexenwerk, Du musst dir einfach ansehen, wie der Login realisiert wurde.

Du kannst z. B. in Firefox mit der "Netzwerkanalyse" (Strg+Shift+Q bzw. Strg+Shift+E oder Menü -> Web-Entwickler -> Netzwerkanalyse) die Requests genau nachvollziehen. Gleiches funktioniert in Chrome (Strg+Shift+J, Network-Tab).

Du kannst im Browser auch mal testen, ob der Login ohne JavaScript funktioniert (Seite aufrufen, JavaScript deaktivieren, anmelden). Wenn ja, ist der bisherige Ansatz schon der richtige.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Webseiten rendern und darin den Quelltext bearbeiten Netzwerkprogrammierung 2
Geese HTML Quelltext auslesen ergibt -null- Netzwerkprogrammierung 2
Spi Unvollständiger Quelltext ausgelesen Netzwerkprogrammierung 10
SebSnake imdb quelltext einlesen Netzwerkprogrammierung 6
T Quelltext einer Website auslesen Netzwerkprogrammierung 3
H Daten auf einer Webseite eintragen Netzwerkprogrammierung 11
K Mit Java ASPX Webseite fern steuern Netzwerkprogrammierung 2
D Webseite(mit JavaScript-Element) mit Java auslesen Netzwerkprogrammierung 0
B HTTP Webseite unter IP-Addresse nicht aufrufbar - unter Domain schon Netzwerkprogrammierung 9
O HTTP Zugriff und Aktionen auf einer Webseite ausführen Netzwerkprogrammierung 9
S Automatischer Login auf einer Webseite Netzwerkprogrammierung 12
H Daten an Textfeld einer Webseite schicken Netzwerkprogrammierung 2
E Webseite mit Login laden Netzwerkprogrammierung 5
J VideoStream von Webseite lesen/speichern Netzwerkprogrammierung 7
M Download von Webseite Netzwerkprogrammierung 4
T Actions WebSeite Netzwerkprogrammierung 3
M Per eigenem Java SE Prog einloggen auf Webseite Netzwerkprogrammierung 19
aze Applet von Webseite aufrufen und mit diesem kommunizieren Netzwerkprogrammierung 8
N Webseite holen, Knöpfe drücken, Textfelder holen, etc. Netzwerkprogrammierung 7
hdi Webseite auf Download-Links prüfen und Download starten? Netzwerkprogrammierung 7
S Zugriff auf Webseite Netzwerkprogrammierung 3
J programm zum autom. ausdruck einer webseite Netzwerkprogrammierung 2
P Webseite ausfüllen und abschicken Netzwerkprogrammierung 6
G Webseite <=> Java Netzwerkprogrammierung 4
S webseite mit cookie besuchen Netzwerkprogrammierung 5
M webseite automatisch ausfüllen und abschicken Netzwerkprogrammierung 2
M webseite holen Netzwerkprogrammierung 7
E In Webseite einloggen/ GET, POST an PHP-Script übergeben Netzwerkprogrammierung 2
Thallius HTTP HTTPS unter Java 1.6 schlägt fehl Netzwerkprogrammierung 4
G HTTP URL öffnen schlägt fehl Netzwerkprogrammierung 3
S website auslesen schlägt fehl Netzwerkprogrammierung 20
M connect von Socket schlägt fehl Netzwerkprogrammierung 6
L Stubs/Skeleton - Erzeugung schlägt stets fehl Netzwerkprogrammierung 12
P Variablen(inhalt) Abgleich Java und PHP schlägt fehl Netzwerkprogrammierung 6
K öffnen des socket schlägt fehl -> ABER: keine exception . Netzwerkprogrammierung 2
D Socketverbindung schlägt fehl - Connection refused: connect Netzwerkprogrammierung 4

Ähnliche Java Themen


Oben