# Webseite auslesen



## Sqwan (17. Mrz 2008)

Schönen guten Tag

Soa... Ich habe ein größeres kleines Problem. 
Und zwar beim verarbeiten einer Webseite. Das Auslesen einer Webseite an sich funktioniert mittlerweile. Jedoch habe ich dies an einer Testseite versucht, die nicht Passwortgeschützt ist. Meine jetztige seite ist jedoch passwort geschützt. Wenn ich nun versuche zu dem link zu Connecten geht das schief, weil ich nicht eingeeloggt bin.

Hat jemand eine Ahnung wie ich sowas realisieren kann, das ich mich vorher einlogge? bzw das sich der jeweilige User per Passwort einloggen kann?

Kann ich das vllt iwie so machen, das ich einfach den aktuellen browser auslese?
Das wäre dann die notlösung wenn es nicht anders geht...
Weil eigendlich sollten die informationen ja ohne browser für der User verarbeitbar sein!!!

MFG Sqwan


----------



## thE_29 (17. Mrz 2008)

Welches Loginverfahren wird da angewandet?!

htaccess geht soweit ich weiß auch mit

http://user:pass@URL

Besser wäre aber das hier: http://www.java-forum.org/de/viewtopic.php?p=203348#203348
Da du ja sonst Username/Passwort in Klartext weiterschickst!

Oder meinst du einloggen via HTML?


----------



## sparrow (17. Mrz 2008)

Wie genau ist denn die Seite passwortgeschützt?
Fragt der Browser nach einem Passwort (.htaccess) oder muss man sich auf der Webseite eibloggen?


----------



## Sqwan (17. Mrz 2008)

Mann muss sich auf einer Webseite einloggen... via php.
Das heist ich habe auf der Seite ein Password feld und ein feld text. Der inhalt wert mit einem submitbutton an eine Logindatei weitergesendet. Die datei vergleicht den usernamen und das Passwort mit dem in der Datenbank und wenn erfolgreich eingloggt wurde, speichert es den aktuellen loginzustand so wie loginzeit in einr session. Zusätzlich wird auch immer die sessionsid gespeichert. Nach jeder aktion wird die datenbank auf den neusten stand gebracht. Das heißt datenbank und sessions sind immer gleich.

Ein direkter zugriff auf die DB ist nicht möglich... Aus sicherheitsgründen darf nur vom server auf die DB zugegriffen werden. Das passwort wird als MD5 gespeichert. 
Das feld für das Passwort heißt pwd und für den nutzernamen user...

Ich denke das sind alle wichtigen Informationen über den aufbau der seite...
MFG Sqwan


----------



## ms (17. Mrz 2008)

Dann handelt es sich wohl um Form-Based Authentication. Ich nehmen an, es wird bei erfolgreichem Login ein temporäres Cookie angelegt bzw. bei deaktivierten Cookies könnte es sein, dass die SessionId per URL-Rewrite für jeden Link mitgeneriert wird. Wie liest du denn die Website aus? Verwendest du eine Bibliothek die ev. mit Cookies umgehen kann? Oder musst du das alles per Hand machen? Dann würde ich mal Cookies deaktivieren.

ms


----------



## Sqwan (17. Mrz 2008)

Mit Cookis habe ich nichts am hut. Und auch die sessionsid schicke ich nicht in jedem link mit...
Ich lasse mir jedes mal eine neue generieren und vergleiche die mit der alten... wenn se anders ist logge ich aus...
Über die sessionsid werde ich nicht zugreifen können. Ich denke ich werde mich iwie neu einloggen müssen mit java.
und mich dann über die links durch die seite navigieren... das problem ist nur das ich nicht weiß wie ich mich neu einlogge... Was aber eigendlich gehen muss, da browser ja auch in einer sprache geschrieben werden müssen... Das heißt das es auch eine möglichkeit geben muss sich einzuloggen...

MFG Sqwan


----------



## ms (17. Mrz 2008)

Entweder verstehe ich dich nicht oder du mich nicht.
Du schickst einmal das Login-Formular ab, bekommst eine Sitzungscookie und kannst danach alle Seiten, die nur im eingeloggtem Zustand navigierbar sind, aufrufen.
Warum jedesmal anmelden?

ms


----------



## Sqwan (17. Mrz 2008)

:-D ich glaube auch wir reden aneinander vorbei...
Also mal ganz simpel. Ich schicke das formular ab bzw die eingegebenen daten.
Diese werden dann von einem PHP script ausgewertet. Ist die auswertung positiv, so wird eine neue session angelegt.
In dieser session speicher ich den Loginzustand als true ab. danach leite ich auf eine seite start.php weiter. 
aus dieser seite wird nach jedem klick geprüft ob der loginzustand true ist. Wenn ja darf man den inhalt sehen. wenn nein wird wieder auf die startseite zurück gesetzt. Die session mit sammt der sessionsid ist auf keine art und weise für den user erreichbar.


----------



## ms (17. Mrz 2008)

Sqwan hat gesagt.:
			
		

> In dieser session speicher ich den Loginzustand als true ab. danach leite ich auf eine seite start.php weiter.
> aus dieser seite wird nach jedem klick geprüft ob der loginzustand true ist. Wenn ja darf man den inhalt sehen. wenn nein wird wieder auf die startseite zurück gesetzt. Die session mit sammt der sessionsid ist auf keine art und weise für den user erreichbar.


Irgendwie widersprichst du dir. Zuerst speicherst du den Loginzustand in der Session aber eigentlich hast du als User gar keinen Zugriff darauf.  ???:L 

Auch verstehe ich noch nicht deine Rolle in deiner Anforderung. Du bist der Client, du leitest gar nichts weiter, das macht der Server.

Wenn ich eine Website auslese greife ich zb über URLConnection/HttpClient/HttpUnit darauf zu. Da habe ich keine Möglichkeit irgendwas in der Session zu speichern. Ich bin der Client der lediglich per HTTP mit dem Server kommunizieren kann. Ich weis nicht einmal, ob auf dem Server im Hintergrund PHP/ASP/JSP/Perl... oder sonstwas läuft, interessiert mich eigentlich auch nicht.

Tatsache ist aber, dass es temporäre Cookies gibt, in der üblicherweise die SessionId abgelegt wird. Auf diese habe ich Zugriff und anhand dieser wird eine Sitzung identifiziert.

ms


----------



## Sqwan (17. Mrz 2008)

Also auf ein neues...
Ich betreibe eine Webseite. Diese ist in PHP geschrieben. Also habe ich auch einen Server. Der server parst die php-dateien. Jetzt zu meinem PHP-skript:

```
<form method="post" action="login.php">
    <input pwd>
    <input user>
    <input button>
</form>
```

so sieht das login-formular meiner seite in sehr vereinfacht aus.
Wenn ich jetzt den butoon drücke wir mein formular abgesendet. login.php verarbeitet.

in etwa so:


```
<?php
    session_start();
    $sql="SELECT user FROM user_tab WHERE user='".$_POST["user"]."';
    vergleich von allem...
    if(alles okay und der user und pwd richtig)
    {
         $_SESSION["logged"] = 1;
         header(...);
    }
?>
```

soa... und schon ist der user so lange eingeloggt bis er logout drückt und $_SESSION["logged"] auf 0 gesetzt wird 
oder bis die sessionsids nicht mehr stimmen und die session abgelaufen ist.

zu beginn der anderen seiten wird dann immer abgefragt ob $_SESSION["logged"] noch true ist.

Das ist die geschichte mit meinem Webserver und allem was sich darauf abspielt.
Der User kriegt ausschließlich die seiten zu gesicht. Mit den sessions hat der nichts am hut.

Jetzt kam jedoch der Wunsch von einigen Usern, die ganzen sachen auch in eifacher textform browser unabhängig nutzen zu können und die wichtigen sachen (Kommt dann ein filter rein, mit dem der user navigieren kann, weiß noch nicht genau wie) in einer TXT datei zu speichern. Alles ohne die seite sehen zu können. Das heißt er gibt ein suchwort ein, und die seite wird auf diese suchwörter untersucht und speichert das dann beliebig in txt dateien ab.

Das heißt für mich, das ich losgelöst vom server eine anwendung brauche, die sich wie bei browser auf meiner seite einloggt (mit den jeweiligen userdaten) und dann den inhalt zeigt.

Im endefeckt brauche ich ale wie bisher ein login formular, mit dem ich mich einlogge, und dann den ganzen html-quellcode bekomme um ihn dann zu analysieren. so wie ein kleiner browser in etwa, nur ohne umwandlung des Quellcodes und anderem schnickschack wie bildern oder so.


----------



## ms (17. Mrz 2008)

:shock: 

Ok, du betreibst diese Website und willst auch gleichzeitig einen Java-Client dafür schreiben.
Das Prinzip habe ich dir schon erklärt. Daran ändert sich nichts.

ms


----------



## Sqwan (17. Mrz 2008)

ms hat gesagt.:
			
		

> Ok, du betreibst diese Website und willst auch gleichzeitig einen Java-Client dafür schreiben.
> Das Prinzip habe ich dir schon erklärt. Daran ändert sich nichts.



Soa...genau das meine ich. Und ich denke das Prinzip das du meinst ist folgendes:



			
				ms hat gesagt.:
			
		

> Dann handelt es sich wohl um Form-Based Authentication. Ich nehmen an, es wird bei erfolgreichem Login ein temporäres Cookie angelegt bzw. bei deaktivierten Cookies könnte es sein, dass die SessionId per URL-Rewrite für jeden Link mitgeneriert wird. Wie liest du denn die Website aus? Verwendest du eine Bibliothek die ev. mit Cookies umgehen kann? Oder musst du das alles per Hand machen? Dann würde ich mal Cookies deaktivieren.



hmm... also leider habe ich noch nie mit sessions und sowas in java gearbeitet...
Kannst du mir vllt einen tipp geben, nach was ich suchen soll, damit ich auf mein problem zuarbeite und mich nicht distanziere? Weil iwie steige ich da nicht so ganz durch... Ich weiß nicht mal ob die per Cooki gespeichert werden oder per URL-Rewrite mitgeneriert werden, und schon garnicht weis ich ob das von bedeutung ist oder wo ich das problem jetzt anpacken soll.

MFG Sqwan


----------



## ms (18. Mrz 2008)

Schau dir mal den HttpClient von Apache an.
http://hc.apache.org/httpclient-3.x/index.html

ms


----------



## thE_29 (18. Mrz 2008)

Das kannst du auch ganz normal machen 

Du holst dir die Verbindung und sagst sowas in der Art:


```
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setDoOutput(true);
    connection.setUseCaches(true);
    PrintStream post = new PrintStream(connection.getOutputStream());
    //stoppelt den Post zusammen
    post.println("ELEMENTE ZUM SCHREIBEN");
    post.flush();
    post.close();
```

Wobei die Elemente sowas ist wie pwd=HALLO?user=schlumpf, etc..
So wie es in der Titelleiste auch ist!


----------



## Sqwan (18. Mrz 2008)

hmmmmm.... also ich habe das wie du ges gepostet hast jetzt mal einfach übernommen...
Ein verbindung findet auch stadt.
Jedoch steige ich bei 

```
post.println("ELEMENTE ZUM SCHREIBEN");
```
überhaupt nicht durch...
Ich weiß garnicht was in die klammern muss. In google habe ich dazu auch nichts gefunden da println natürlich sehr weitläufig ist und auch in verbingung mit PrintStream komme ich zu keinen brauchbaren ergebniss. 
Vllt kann mir da noch mal jemand einen hinweiß geben...

Naja... Nun ist aber auch direkt nicht in weiterer fehler aufgetreten, das aber nur mit der Visualisierung zusammen hängt.
Also ich habe einen Button. Wenn man den Klickt soll verbunden werden. Jeoch kann ich im ActionListener nicht die methode aufrufen. Ich kriege ein problem mit den Exceptions...
wenn ich throws MalformedURLException, IOException, ProtocolException dann an actionPerformed(ActionEvent e) schreibe, sagt er mir aber auch das ich das nicht darf...

Gibt es da eine möglichkeit dies zu umgehen...
MFg und Herzlichen dank schon mal
Sqwan


----------



## thE_29 (19. Mrz 2008)

Naja, du schreibst das hinein was du oben in der Adresszeile hättest!

Wenn du bei google nach asdf suchen würdest, müsstest du das hineinschreiben

post.println("search?hl=de&q=asdf&btnG=Google-Suche&meta=");

Dann würde er die Abfrage schicken!

Zb hier auch beschrieben: http://www.javaworld.com/javatips/jw-javatip34.html

Nachtrag: Wenn das ganze aber zuviel wird, würde ich dir ein Framework empfehlen!

Zb HTTPClient: http://www.innovation.ch/java/HTTPClient/getting_started.html hier schreibt man die Post Daten in ein NVPair Objekt rein (Name und Wert).

Es ist halt einfach sauber getrennt.


----------



## Sqwan (19. Mrz 2008)

search?hl=de&q=asdf&btnG=Google-Suche&meta=

wenn ich das nun so absende, wird dan "de" und "asdf" und "Google-Suche" per post übermittet? weil normalerweise ist das was nun da steht ja die absendemethode für ein GET element... zumindest in php.
Und kann ich denn abfragen ob der login erfolgreich war? Weil dann kann ich damit mal ein bischen probieren.

Das Framework würde ich auch gerne mal probieren... was muss ich denn dafür importieren?


----------



## thE_29 (19. Mrz 2008)

Naja, du kannst die neue Webseite auslesn und dann abspeichern! Diese dann mit dem Browser aufmachen und schaun was er dir anzeigt 

Und hier gibt es das Paket zum Downloaden: http://www.innovation.ch/java/HTTPClient/


----------



## Sqwan (19. Mrz 2008)

grrr... langsam verzweifel ich. 
Es will einfach nicht funktionieren... Nichtmal bei google...


```
protected static HttpURLConnection mkConnection() throws MalformedURLException, IOException, ProtocolException
	{
		URL src = new URL("http://www.google.de/index.php");
			
		HttpURLConnection connection = (HttpURLConnection) src.openConnection();
	    connection.setRequestMethod("POST");
	    connection.setDoOutput(true);
	    connection.setUseCaches(true);
	    PrintStream post = new PrintStream(connection.getOutputStream());
	    //stoppelt den Post zusammen
	    post.println("http://www.google.de/search?hl=de&q=hallo&btnG=Google-Suche&meta=");
	    System.out.println(connection.getResponseMessage());
	    System.out.println(connection.getResponseCode());
	    post.flush();
	    
	    InputStream in = connection.getInputStream(); 
	    OutputStream out = new FileOutputStream("file_copy.html");
	    byte buf[] = new byte[1024];
	    int x = 0;
	    while ( ( x = in.read(buf,0,buf.length) ) != -1)
	    {
	      out.write(buf,0,x);
	    }
	    in.close();
	    out.close();
	    
	    post.close();
	    
	    return connection;
	}
```
so sieht meine "methode" jetzt aus... bei google kriege ich eine extension, bei meiner seite und bei ein paar seiten auf denen ich registriert bin kriege ich auch nur die startseite ausgelesen mit dem quellcode...

MFG Sqwan


----------



## Sqwan (20. Mrz 2008)

:cry: es geht einfach nicht weiter?!?!
Ich kriege es nicht hin das er sic einloggt. nur den verbindungsaufbau per buttonclick habe ich hinbekommen...

Kann mir vllt noch mal jemand helfen bei der sache mit dem einloggen?!?!

MFG Sqwan


----------



## Andreas E (5. Mai 2008)

Hallo,


> //stoppelt den Post zusammen
> post.println("http://www.google.de/search?hl=de&q=hallo&btnG=Google-Suche&meta=");
> System.out.println(connection.getResponseMessage());
> System.out.println(connection.getResponseCode());



Dein Fehler liegt darin, dass du die Adresse im Post nicht mitsenden darfst!! Das müsste so lauten:


> post.println("search?hl=de&q=asdf&btnG=Google-Suche&meta=");



MfG
Andreas


----------

