# Verbindung zu SQL-Datenbank auf einem Server



## Einklang. (25. Jun 2012)

Hallo,

ich komm an einer Stelle nicht weiter:
Eine Verbindung zu einer Datenbank auf einem Server aufbauen.

Habe folgenden Code:

```
public void createDBConnection()
    {
    try
        {
        Class.forName("com.mysql.jdbc.Driver");
        dbconnection = DriverManager.getConnection("jdbc:mysql://www.domain.de:3306/datenbank","benutzer","passwort");
        }
    catch(SQLException ex)
        {
        System.out.println("SQL-Exception beim Anlegen der DBConnection:"+ex.getMessage());
        }
    catch(ClassNotFoundException ex)
        {
        System.out.println("ClassNotFoundException beim anlegen der DBConnection:"+ex.getMessage());
        } 
    }
```

Dann kommt die Fehlermeldung dass keine Verbindung aufgebaut werden konnte:


```
public void testconnectionDB(DefaultTableModel defaultTableModel)
    {
    if(dbconnection==null)
    {
        System.out.println("Abfrage nicht möglich, Connection ist null");
        System.out.println(dbconnection);
        return;
        }
    try.........
```

Ich habe schon Programme installiert gehabt, die eine Verbindung zur Datenbank aufgenommen haben und von dort die Daten ausgelesen und auf die Festplatte kopiert haben.

Nur weiß ich jetzt nicht wo ich nach dem Fehler suchen sollte....!

besten Dank


----------



## SlaterB (25. Jun 2012)

zur Sicherheit als erstes direkt nach der Zeile
> dbconnection = DriverManager.getConnection ..
schauen ob dbconnection da null ist, 

eine erfolgreiche Ausgabe noch im try bestätigt auch, dass keine Exception auftritt, oder anderenfalls deren Information posten


----------



## Einklang. (25. Jun 2012)

SlaterB hat gesagt.:


> zur Sicherheit als erstes direkt nach der Zeile
> > dbconnection = DriverManager.getConnection ..
> schauen ob dbconnection da null ist,
> 
> eine erfolgreiche Ausgabe noch im try bestätigt auch, dass keine Exception auftritt, oder anderenfalls deren Information posten



Ok ich hab darunter jetzt erst eine Ausgabe und eine if-Abfrage gesetzt:


```
System.out.println(dbconnection);
if (dbconnection==null){
        	System.out.println("Verbindung ist leider nicht vorhanden");
        }
        else {
        	System.out.println("Verbindung sollte funktionieren");
        }
```

Die Ausgabe zeigt nichts an und es wird keine von beiden Anweisungen ausgegeben...... entweder hab ich die if-Abfrage falsch gemacht oder naja keine Ahnung... die Methode wird gar nicht verarbeitet.... !



Nachtrag - ich hab noch eine Ausgabe mit String eingebaut und dieser wird auch nicht angezeigt - die Methode scheint nicht verarbeitet zu werden.......!


----------



## SlaterB (25. Jun 2012)

das Programm beginnt mit einer main, dort muss die erste Zeile eine Ausgabe sein, etwa 'Hello World',
wenn die fehlt, dann weiter zu überlegen,
ansonsten aber bei allen Programmen langsam vortasten, bis zum Aufruf der Methode, zu Beginn dieser und anderer Methoden usw., 
überall Ausgaben,
oder Debugger


----------



## Einklang. (25. Jun 2012)

Ja das Ding ist ja ich hab zwei Datenbankverbindungen - eine zu ner lokalen SQL und diese neue zu einer Datenbank bei nem Host aufm Server.

Das Ding ist, dass die erste Verbindung wohl immer aktiv ist und von mehreren anderne Methoden genutzt wird! Ist bisher gar nicht aufgefallen...!


----------



## Einklang. (26. Jun 2012)

ok hab rausgefunden dass eine Verbindung gleich am Start aufgerufen wird, hab das geändert und rufe die Verbindung einzeln auf in der Methode die dann Daten verarbeitet.

Jetzt funktioniert es auch mit beiden Verbindungen!


----------



## MySQLSecurity (26. Jun 2012)

Sorry wenn ich mal so direkt frage, aber bei welchem Provider hast du die Datenbank das du dich von außen connecten kannst ? Und dann noch auf Standard-Port oder Crypto/Zertifikate ? Sieht mir nach nem ziemlich schlechten Provider aus der von Sicherheit scheinbar überhaupt keine Ahnung hat. Von daher wäre es wirklich mal interessant zu wissen was mit "www.domain.de" gemeint ist, weil den Provider will ich mir auch mal geben. Ein Anbieter der sich um die Sicherheit seiner Kunden-Daten überhaupt keine Platte macht und dafür wahrscheinblich sogar noch Kohle verlangt. Man kann echt aus S*****e Gold machen.


----------



## SlaterB (26. Jun 2012)

nicht dass ich da Details wüßte, aber was genau verlangst du mehr an Sicherheit?
ein anderer Port wäre schon ein Gewinn?
die DB ist doch durch Benutzer/ Passwort so normal geschützt wie alles im Internet, auch der geheime Geheimdienst-Login?


----------



## MySQLSecurity (26. Jun 2012)

Es geht erstmal grundsätzlich darum das die Datenbank überhaupt direkt von außen erreichbar ist.
Wie in vielen anderen Themen diskutiert sollte man WebServices verwenden. Dadurch kann man dann auch die Datenbank so konfigurieren das nur Verbindungen von localhost zugelassen werden. Und den WebService kann man dann über SSL laufen lassen. Das wäre zumindest ein Anfang.
Oder wenn es halt unbedingt direkter Zugang sein muss dann auf jeden Fall anderen Port (das einzige was man auf "default-port" laufen lassen sollte wäre HTTP), zusätzlich natürlich via SSL gesichert und auf jeden Fall mit Client-Zertifikat, denn "nur" durch User/Passwort erweckt bei mir nicht so das Sicherheitsgefühl.
Und das sind so Sicherheitsrelevante Punkte die man in der heutigen Zeit dann doch schon mal im Hinterkopf behalten sollte. Außerdem gibt das (ja mitlerweile auch breitgetretene) Thema : Login-Daten in User-Software. Das ist ein absolutes NO-GO und verlangt ja nach einem WebService wodurch es eh hinfällig wird direkt zur DB zu connecten.

Also ich weis zwar nicht wie es dir und anderen geht, aber bei solch gravierenden Sicherheitsmängeln würde ich mir sicherlich keine Datenbank beim (leider nicht genannten) Provider holen.


----------



## SlaterB (26. Jun 2012)

gerade Java laufen zu lassen ist doch vergleichsweise selten bei einfachen billigen Webservern,
und dass nun die vorgeschaltete Anwendung sicherer ist, geschieht auch nicht von selber ohne entsprechende Kenntnisse,
zudem viel zu kompliziert

das klingt so als sollte man sein Fahrrad in eine extra Tiefgarade plus eigens angestellen Pförtner mit Ausweiskontrolle stellen,
statt nur per Zahlenschloss in 3 sec standard-gesichert 

für ein großes Unternehmen kann man sich solche Späße erlauben, 
wenn man aber testweise die Technologien kennenlernt,  ist das bisschen übertrieben, oder?

wobei Einklang. durchaus kommerziellen Hintergrund hat, wenn ich mich recht erinnere/ zurückblicke


----------



## Plopo (26. Jun 2012)

Vielleicht noch eine kleine Anmekrung nebenbei.
Sollte dein Programm öffentlich verbreitet werden ist es eine leichtigkeit, mittels Decompilern, an deinen Code zu kommen.
Somit könnte (fast) jeder die Daten deiner DB auslesen (da diese im Quellcode stehen (Benutzername, Passwort, etc.)).

Für so etwas ist es besser die DB über eine PHP-Datei zu verwalten und nur via URL-Aufruf mit der DB zu kommunizieren (Sachen auslesen).

Solltest du auch Daten in die DB schreiben wollen (mittels Java) weis ich nicht genau wie man dies sicher, über URL-Aufruf, gestalten kann.


----------



## Kohlrübe1423 (26. Jun 2012)

Plopo hat gesagt.:


> Vielleicht noch eine kleine Anmekrung nebenbei.
> Sollte dein Programm öffentlich verbreitet werden ist es eine leichtigkeit, mittels Decompilern, an deinen Code zu kommen.
> Somit könnte (fast) jeder die Daten deiner DB auslesen (da diese im Quellcode stehen (Benutzername, Passwort, etc.)).
> 
> ...



Warum ist nur der Schreibzugriff zu sichern?
Wie sichert du den PHP-Lese-Zugriff ab? Daten kann jeder rausholen?

Mit PHP wird eine unsichere Lösung mit der nächsten vertauscht.


----------



## MySQLSecurity (26. Jun 2012)

Kohlrübe1423 hat gesagt.:


> Warum ist nur der Schreibzugriff zu sichern?
> Wie sichert du den PHP-Lese-Zugriff ab? Daten kann jeder rausholen?
> 
> Mit PHP wird eine unsichere Lösung mit der nächsten vertauscht.



Nahh ... da würde ich so nicht mitgehen.
Begründung : man muss erstmal den Aufbau einer halbwegs korrekten URL kennen um überhaupt an irgendetwas zu kommen. Und das kann man schon sehr kompliziert machen. Es ist also schon sicherer anstatt wie bereits erwähnt die Daten direkt im Client stehen zu haben (das habe ich übrigens ganz oben schon erwähnt).

Zum "sichern" der Schreibzugriffe : auf jeden fall kann man manipulierte Anfragen entschärfen und so SQL-Injections großteils verhindern. Wenn diese Kontrolle nur von der Software übernommen wird und man diese aushebelt hat man keine "letzte Sicherheit" mehr.

Ein WebService macht hier also durch aus sinn. Verstehe daher dein "beides genau so unsicher" überhaupt nicht !


----------



## Plopo (26. Jun 2012)

Kohlrübe1423 hat gesagt.:


> Wie sichert du den PHP-Lese-Zugriff ab? Daten kann jeder rausholen?
> Mit PHP wird eine unsichere Lösung mit der nächsten vertauscht.



Naja im Falle einer News App. Ist es mir recht schnuppe ob der User die URl in den Browser eingibt und einen JSON-String ausgegeben bekommt oder ob er es grafisch-aufbereitet in der App sieht.
Beim auslesen von Nutzerdaten/Passwort etc. sollte man eh auf einen Webservice zurückgreifen.


----------

