# Java über php datei lesen?



## lovestern26 (2. Dez 2009)

Hy Leute,
ich wollte mal fragen wie kann Java von eine php datei lesen?
Ich habe leider in google nichts darüber gefunden.
Ich wollte es so machen von Java ChatClient über eine php datei in die datenbank einlesen lassen und einträge tätigen.
Ist so etwas möglich?

Bitte um Hilfe.

Ich bedanke mich schon im voraus.


----------



## Aradiv (2. Dez 2009)

Die wohl einfachste Variante ist einen HTTP Request an das PHP Script zu senden. Der einfachheit halber würde ich zu einer GET-Anfrage Tendieren.


mfg
Aradiv


----------



## lovestern26 (2. Dez 2009)

Aradiv hat gesagt.:


> Die wohl einfachste Variante ist einen HTTP Request an das PHP Script zu senden. Der einfachheit halber würde ich zu einer GET-Anfrage Tendieren.
> 
> 
> mfg
> Aradiv



Vielen dank für deine antwort
aber ich wollte es so mach über php sollte nur eine mySQL datenbankverbindung hergestellt werden und über den Java ChatClient zu chatten. Damit wollte ich vermeiden einen Chatserver zu programmieren.


----------



## javimka (2. Dez 2009)

Zufälligerweise habe ich gerade letztlich genau diese PHP<->Java Kommunikation programmiert 
Das Php-Programm zum lesen der Datei (etwa so):

```
<?php 
mysql_connect("localhost","username","passwort") or die("Keine Verbindung möglich");

mysql_select_db("Datenbank") or die("Die Datenbank existiert nicht");

$query = "SELECT * FROM `daten` ... ";
$result = mysql_query($query);

$num = mysql_numrows($result);

$i=0;
while ($i < $num) {
	echo mysql_result($result,$i,"Spalte1").";";
	$i++;
}
?>
```
Mit diesem Skript kannst du die Datenbank auslesen und in irgendeiner Form ausdrucken.

Folgende Java-Methode liesst diese Daten ein

```
public void download() {
	try {
		URL url = new URL( "http://www.webseite.ch/read.php");
		Scanner scanner = new Scanner( url.openStream() ).useDelimiter( "\n" );
		while(scanner.hasNext()) {
	       		String line = scanner.next();
	       		System.out.println(line);
	    	}
	} catch (Exception e) {
		e.printStackTrace();
	}
}
```


Schwieriger ist es, Daten zu senden. Du könntest das mit get-Variabeln machen. Das sind die Einträge in der URL hinter dem "?". Folgendes php-Skript liesst diese Variabeln und fügt sie in die Datenbank:

```
<?php
mysql_connect("localhost","username","passwort") or die("Keine Verbindung möglich");

mysql_select_db("Datenbank") or die("Die Datenbank existiert nicht");

$spalte1= $_GET["spalte1"];

$query = "INSERT INTO `daten` ( `spalte1` , ... ) VALUES ('".$spalte1."', ... );";

mysql_query($query);
?>
```

Und mit folgender Java-Methode kannst du dem Php-Skript Daten zukommenlassen. 123 in Spalte1, 456 in Spalte 2:

```
public void upload() {
	try {
		String entry  = "http://www.webseite.ch/write.php?spalte1=123&spalte2=456";
		URL u = new URL(entry);
		u.openStream(); // vielleicht gibt es hier auch eine Alternative dazu
	} catch (Exception e) {
		e.printStackTrace();
	}
}
```

Falls jemand einen Fehler oder eine Gefahr sieht, bitte posten, hilft mir selber auch weiter


----------



## madboy (2. Dez 2009)

> $spalte1= $_GET["spalte1"];
> 
> $query = "INSERT INTO `daten` ( `spalte1` , ... ) VALUES ('".$spalte1."', ... );";


GEFAAAAHR ;-) Niemals nicht ohne Überprüfung und vor allem Escaping Werte, die vom Benutzer geliefert werden in ein SQL-Statement einbauen...
Stell dir vor, jemand baut so eine URL (bin da kein Experte, aber das Prinzip sollte passen):

```
h ttp://example.com/page.php?spalte1='); drop table daten;
```

dann wird deine Tabelle "daten" gelöscht (was noch harmlos ist eigentlich).

Suchmaschine anwerfen zum Stichwort "sql injection" und du wirst wahrscheinlich erschrecken was möglich ist


----------



## lovestern26 (2. Dez 2009)

madboy hat gesagt.:


> GEFAAAAHR ;-) Niemals nicht ohne Überprüfung und vor allem Escaping Werte, die vom Benutzer geliefert werden in ein SQL-Statement einbauen...
> Stell dir vor, jemand baut so eine URL (bin da kein Experte, aber das Prinzip sollte passen):
> 
> ```
> ...



Ich bedanke mich bei euch für eure Hilfe ich werde es ausprobieren und auch nach "sql injection" googlen.
Mfg


----------



## javimka (2. Dez 2009)

Vielen Dank für die Bemerkung, hätte ich erwähnen sollen. Das sollte das php-Skript auf jeden Fall überprüfen. Ich habe dazu die Befehle [c]strip_tags[/c] (für HTML Tags) und [c]mysql_real_escape_string[/c] (für MYSQL-Befehle) gefunden, aber noch nicht eingebaut.
Ob diese zwei Befehle schon reichen und alles Böse abdecken?


----------



## madboy (2. Dez 2009)

Wie gesagt bin ich da kein Experte, aber es schadet nie, die Techniken potentieller Angreifer zu studieren. Für PHP existieren viele Beispiele, was man tun und lassen sollte. 

```
mysql_real_escape_string
```
 sollte die meisten injections abfangen aber ganz sicher wird das auch nicht sein vermutlich.

Auch ganz interessant sind Seiten wie :: Happy-Security :: - Hackits, Challenges, Tutorials oder http://www.hackthissite.org/
Macht Spaß und man lernt noch was zum Thema Sicherheit.


----------



## lovestern26 (2. Dez 2009)

madboy hat gesagt.:


> Wie gesagt bin ich da kein Experte, aber es schadet nie, die Techniken potentieller Angreifer zu studieren. Für PHP existieren viele Beispiele, was man tun und lassen sollte.
> 
> ```
> mysql_real_escape_string
> ...



Ok werde ich mir ansehen. Ja Thema Sicherheit spiel ein sehr große Roll.
Danke euch.
Mfg


----------



## tuxedo (2. Dez 2009)

Vielleicht lohnt auch ein Blick auf das hier: https://jpmdbc.dev.java.net/

Hab ich während meiner Diplomarbeit so nebenher mal gebastelt...
Die JDBC Schnittstelle ist zwar nicht zu 100% ausimplementiert (die Meta-Klassen fehlen), aber für das "übliche" sollte es reichen.

- Alex


----------



## lovestern26 (2. Dez 2009)

tuxedo hat gesagt.:


> Vielleicht lohnt auch ein Blick auf das hier: https://jpmdbc.dev.java.net/
> 
> Hab ich während meiner Diplomarbeit so nebenher mal gebastelt...
> Die JDBC Schnittstelle ist zwar nicht zu 100% ausimplementiert (die Meta-Klassen fehlen), aber für das "übliche" sollte es reichen.
> ...



Vielen dank. naja ich weiß nicht so genau wie man das mit JDBC verbindung aufbaut bzw. den treiber dafür installiert auf den server ich habe einen v-Server mit dem betriebsystem Debian 4 drauf......


----------



## tuxedo (2. Dez 2009)

Naja, dann musst du nix weiter tun als

1) JPMDBC runterladen
2) jpmdbc.php auf deinen Server legen
3) Den Beispielcode (https://jpmdbc.dev.java.net/source/...t1/jpmdbc/testing/JpmdbcTest.java?view=markup) benutzen um SQL-Kommandos auf deinen Server los zu lassen ...

Wenn du deinen Apache-Webserver SSL tauglich konfiguriert hast, sind die Abfragen auch "abhörsicher". 

- Alex


----------



## Spacerat (2. Dez 2009)

Ich kann madboy nur beipflichten... die Seite wäre in 2 Minuten matsch oder ein potentieller Angreifer hätte sie sich in dieser Zeit auch gemailt (Ich meine den PHP-Quellcode und nicht das was dabei heraus kommt. Ausserdem: ungefiltertes write über GET ohne Verzeichnisschutz? Was ist denn, wenn jemand schlicht die Links abfängt? der kann in die DB schreiben, was er will. Hier mal ne simple HTTP-Authentifikation (Base64-Encoded).
	
	
	
	





```
URL u = new URL("http://some.url");
String auth = "user:password";
char[] cdecoded = auth.toCharArray();
byte[] bdecoded = new byte[cdecoded.length];
int n;
for(n = 0; n < bdecoded.length; n++) {
	bdecoded[n] = (byte) cdecoded[n];
}
auth = "BASIC " + Base64.encode(bdecoded);
URLConnection uc = u.openConnection();
uc.addRequestProperty("Authorization", auth);
InputStream in = uc.getInputStream();
```
Ich hoffe du weisst, wie man diesen Verzeichnisschutz erstellt.
@Edit: Und dann noch das was tuxedo schreibt (von wegen SSL und so...), dann sollte jut sein...


----------



## lovestern26 (2. Dez 2009)

Spacerat hat gesagt.:


> Ich kann madboy nur beipflichten... die Seite wäre in 2 Minuten matsch oder ein potentieller Angreifer hätte sie sich in dieser Zeit auch gemailt (Ich meine den PHP-Quellcode und nicht das was dabei heraus kommt. Ausserdem: ungefiltertes write über GET ohne Verzeichnisschutz? Was ist denn, wenn jemand schlicht die Links abfängt? der kann in die DB schreiben, was er will. Hier mal ne simple HTTP-Authentifikation (Base64-Encoded).
> 
> 
> 
> ...


Danke euch nochmal.


----------



## javimka (2. Dez 2009)

Du hast dafür das Passwort im Java-Code. Das ist ja nullkommanichts geknackt und dann hat der Angreifer Zugriff auf die gesamte Datenbank. Natürlich kann bei meiner Methode jeder Einträge in die Datenbank machen, aber immerhin ist das Php-Skript im Stande gewisse gefährliche Einträge abzufangen. Somit besteht zumindeste in minimaler Schutz. Und wie das ganze noch sicherer gehen könnte, wüsste ich nicht.
Selbst wenn du das Passwort auf irgendeine geniale Weise obfuskierst, wird ein nicht vernachlässigbares Restrisiko bestehen, dass es rekonstruiert werden kann.


----------



## tuxedo (3. Dez 2009)

Dem kann ich nur zustimmen. Bei JPMDBC ist das das gleiche Problem: Das Passwort sollte nicht hardcodiert sein, sondern vom User eingegeben werden. Ansonsten ist das ganze vergleichbar mit einer phpMyAdmin-Installation der das Passwort beiliegt und direkt im Login-Screen mit angezeigt wird 

- Alex


----------



## Spacerat (3. Dez 2009)

Mal langsam Kollegen... wo hätte ich es denn im Beispiel hinschreiben sollen? in einen anderen Thread?  Naja... ihr habt ja recht. Hätte ich vllt. drauf hinweisen sollen.
Auf was man allerdings noch hinweisen sollte, ist, das bei der BASIC-Authentification, das PW nahezu im "Klartext" (nur Base64 encoded) übermittelt wird, und es ein leichtes ist das zu bekommen. Besser wäre dafür DAA geeignet. Aber die wird afaik nicht von jedem Server unterstützt. Ausserdem hab' ich das in Java auch noch nicht gemacht, weil, es bestand kein bedarf.


----------



## tuxedo (3. Dez 2009)

Naja, wenn dann SSL kombiniert mit "Passwort nicht im Quellcode speichern oder hardcodieren" ...

Alternativ kann man auch die Statements auf PHP Seite hardcodieren, ebenso das Passwort etc. Dann kann man von Java aus nur noch die Parameter für die Statements übergeben. Allerdings schränkt das die flexibilität etwas ein. Für "Spezialanwendungen" sollte das aber nicht so das Problem sein. 

- Alex


----------



## lovestern26 (3. Dez 2009)

tuxedo hat gesagt.:


> Naja, wenn dann SSL kombiniert mit "Passwort nicht im Quellcode speichern oder hardcodieren" ...
> 
> Alternativ kann man auch die Statements auf PHP Seite hardcodieren, ebenso das Passwort etc. Dann kann man von Java aus nur noch die Parameter für die Statements übergeben. Allerdings schränkt das die flexibilität etwas ein. Für "Spezialanwendungen" sollte das aber nicht so das Problem sein.
> 
> - Alex



Ich möchte an alle mein besten dank aus sprechen.
Schaut nicht sehr einfach aus das ganze. xD


----------

