kostenloser Webspace werbefrei: lima-city


C# (.exe) mysql passwort -> sicher?

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    Hallo LC,
    ich möchte mit C# ein programm schreiben das meine MYSQL DB abfragt.
    Wenn dieses Programm fertig ist soll dies öffentlich zum Download bereit stehen.
    Meine Frage:
    ist das Passwort der DB in der exe sicher, kann man es nicht irgendwie knacken?
    Hilfe?!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. t****o

    Spätestens bei der unverschlüsselten Übertragung an den Server kann ein potenzieller Angreifer das Passwort rausfiltern...
  4. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    telelo schrieb: Spätestens bei der unverschlüsselten Übertragung an den Server kann ein potenzieller Angreifer das Passwort rausfiltern...


    mh... das ist Doof :-)
    ich habe eine kleine Community geschrieben und möchte nun einen Chat Clienten für den PC schreiben.
    Dies habe ich bereit mit webrequest versucht, mein Script hat sich auf meiner Website eingeloggt und benötigte Daten aus dem Quelltext gefiltert. Dies war aber nicht sehr zuverlässig.

    Dann ist mit die Idee gekommen das ganze per API zu lösen. Also ich wollte APIs für meine Website schreiben. Diese sollten/sollen mit XML antworten. Da weiß ich aber noch nicht wie ich da vorgehen soll. Das müsste ich ja wieder mit webrequest machen.

    und jetzt hatte ich die Idee die benötigten Daten gleich von der DB zu holen. Ich habe mir aber gedacht das man das PW filtern kann und habe vorher gefragt :-)
    wenn ich nur weiter wüsste..
  5. Z.b. mit einem Programm wie Ollydbg, kann man die .exe wieder(wenn auch nur assembler) code zurück compilieren. Und dann kann man ja einfach nach allen text strings oder sonstigem das Programm durchsuchen.
  6. und wie regeln Programme wie ICQ, Skype & Co so etwas?
    Die Zugangsdaten werden da ja auch in einer Datenbank gespeichert und vom jeweiligen PC geändert und gesendet.
  7. siteplayer schrieb:
    und wie regeln Programme wie ICQ, Skype & Co so etwas?
    Die Zugangsdaten werden da ja auch in einer Datenbank gespeichert und vom jeweiligen PC geändert und gesendet.

    Die Server von denen werden wohl mit einer eigens entwickelten Software laufen und ein eigenes Protokoll verwenden, und keine MySQL-Datenbank.
  8. Naja, auch große Firmen, auch im Internet arbeiten mit Mysql. ICQ oder so verschlüsselt die Daten nur auf eine bestimmte Art und weise. Das kanst du z.B. über SSL machen. Dann brauchst du aber ein Kostenpflichtiges Zertifikat davon. Es gibt auf jedenfalls viele Möglichkeiten das sicher zu übertragen. Schau mal in der Visual Studio Hilfe.
  9. t*****b

    Der Unterschied ist, dass die Daten vom Client an eine Serversoftware gesendet werden und das Serverpogramm die Verbindung mit der DB aufnimmt. So kann de Client mit dem Server kommunizieren, ohne dass eine direkte Verbindung mit der DB nötig ist.
  10. trueweb schrieb:
    Der Unterschied ist, dass die Daten vom Client an eine Serversoftware gesendet werden und das Serverpogramm die Verbindung mit der DB aufnimmt. So kann de Client mit dem Server kommunizieren, ohne dass eine direkte Verbindung mit der DB nötig ist.
    Reicht es denn aus wenn ich meine Daten an ein einfaches PHP Script schicke das diese dann auswertet und weiterverarbeitet und Daten ausgibt?

    Welche kostenlose / -günstige Möglichkeiten gibt es denn seine Daten verschlüsselt an mein Serverscript zu schicken?
  11. MD5 Verschlüsselung dürfte wohl die einfachste Lösung für dein Problem sein.

    Du musst in deiner Software nur dafür sorgen dass das Passwort niemals im Klartext, sondern gleich verschlüsselt abgelegt wird.

    Jetzt kommt es natürlich darauf an an welcher Stelle du die Abfrage startest. Wenn du nun eine Webseite hast, wie bei Lima-City halt auch, wo der User sich einloggen kann/muss, dann macht es sinn das PW in der Datenbank bereits verschlüsselt auf dem Server zu speichern. Passwort auf der Webseite eingeben, verschlüsseln mit MD5, und dann mit dem verschlüsselten PW vergleichen.

    Hast du nun eine Software die local arbeitet hast du ein Problem, die Verbindung und die damit verbundene Datenübertragung. Hier ist das sicherste wenn du das PW dann verschlüsselt local speicherst. Dann könntest du das PW im klartext eingeben, verschlüsseln und vergleichen, wie bei der Webseite auch. Wenn jetzt ein böser Bube das verschlüsselte PW raus bekommt könnte er damit noch immer nichts anfangen, denn die Software würde das verschlüsselte Passwort bei der Eingabe dann halt nochmal verschlüsseln und es käme was absolut anderes raus.

    Jetzt die Mischsituation, du hast ein locales Programm und ein online gespeichertes Passwort. Hier empfielt es sich das PW logischerweise verschlüsselt zu speichern und auch verschlüsselt zu senden. Allerdings würde hier ein böser Bube einfach die Verschlüsselte Version senden können und würde trotzdem erfolg haben. Deswegen ist es hier ratsam zusätzliche Fakedaten zu senden. Das Kann zum einen sein ein Stringanhängsel, währe die einfachste Form. Oder du denkst dir irgendetwas aus was sich ändert, z.B. Datum oder so, verschlüsselst dieses mit, Aber nicht in MD5, da MD5 nur in eine Richtung verschlüsselt und nicht entschlüsselt, und lässt das am Ziel wieder raus rechnen.

    Verschiedene Mixmethoden, je komplexer um so besser, bringen hier auch mehr Sicherheit. Wichtig ist nur dasss du die Fakedaten so verschlüsselst und mit sendest dass das Ziel diese wieder raus rechnen kann.
  12. Nun MD5 gilt allerdings auf vielen Websites als Unsicher. Ich habe bisher das Passwort mehrfach verschlüsselt in die Datenbank gespeichert. Nun bräuchte ich ja dann aber eine Komplett andere Verschlüsselung um die Daten vom PC sicher an meine Seite zu schicken. Gibt es den für C# nicht "geknackte" Verschlüsselungen die ich auch wieder entschlüsseln kann?
  13. a******n

    Gibt es den für C# nicht "geknackte" Verschlüsselungen die ich auch wieder entschlüsseln kann?

    :confused: Verstehe ich nicht. Alle "geknackten" Verschlüsselungen sind für sichere Datenübertragungen sowieso nicht mehr zu gebrauchen.

    Der einfachste Weg zur Passwortauthentifizierung besteht durch Hash-Algorithmen wie schon einmal angeklungen. Zwar kann MD5 geknackt werden, allerdings nur mit einem großen Aufwand über Rainbow-Tabellen und Kollisionen, die es nun bei MD5 gibt. Verwende doch stattdessen SHA-256. Das gilt als sicher.

    Trotzdem nur das Passwort zu hashen, ist kein guter Weg. Wenn jemand den Hash abfängt, kann er sich auch ohne Kenntnis bei deinem Server einloggen. Daher werden die Passwörter heutzutage "gesalzen" (salted passwords). Das heißt z.B. an das gehashte Passwort eine zusätzliche zufällige Zeichenkette heran gehangen und dann wieder gehasht. Diesen schickst du dann an den Server, der den Hash vergleicht. Natürlich muss der Server eine vorher berechnete Datenbank haben, wo die Passwörter mit der Zeichenkette gehasht vorliegen. Damit wäre das Problem immer noch nicht gelöst. Allerdings kannst du nun die zufällige Zeichenkette wöchentlich ändern (dann auch Hash-Tabelle neue berechnen) und so die Verwendung einschränken.

    Sicher ist es trotzdem nicht. Ohne SSL-Verschlüsselung ist eine Remote-Authentifizierung nur mit Aufwand zu erreichen, aber nicht unmöglich. Wie wäre es mit der Verwendung eines Stromkodierers wie RC5. Im Internet sollte es genügend Codebeispiele für PHP und C# geben. Dann hättest du per Skript eine schonende Verschlüsselung aufgebaut, mit dem du das gesalzene Passwort zur Authentifizierung senden könntest.
  14. Alle "geknackten" Verschlüsselungen sind für sichere Datenübertragungen sowieso nicht mehr zu gebrauchen.
    Genau deswegen hatte ich auch gefragt.

    Momentan werden die PW bei mir ca 1000-3000 mal mit verschiedenen werten verschlüsselt. Nur wusste ich nicht ob ich auch alle Funktionen wie sha1 und Co in c# verwenden kann. Bin zur Zeit leider noch nicht sehr viel weiter gekommen beim Lernen.

    Trotzdem nur das Passwort zu hashen, ist kein guter Weg. Wenn jemand den Hash abfängt, kann er sich auch ohne Kenntnis bei deinem Server einloggen. Daher werden die Passwörter heutzutage "gesalzen" (salted passwords). Das heißt z.B. an das gehashte Passwort eine zusätzliche zufällige Zeichenkette heran gehangen und dann wieder gehasht. Diesen schickst du dann an den Server, der den Hash vergleicht. Natürlich muss der Server eine vorher berechnete Datenbank haben, wo die Passwörter mit der Zeichenkette gehasht vorliegen. Damit wäre das Problem immer noch nicht gelöst. Allerdings kannst du nun die zufällige Zeichenkette wöchentlich ändern (dann auch Hash-Tabelle neue berechnen) und so die Verwendung einschränken.
    Ich hatte vor bestimmte Werte an das PW anzuhängen die im Programm gespeichert sind und zudem noch in der Datenbank. So könnte ich diese vergleichen und abfragen.
    Sicher ist es trotzdem nicht. Ohne SSL-Verschlüsselung ist eine Remote-Authentifizierung nur mit Aufwand zu erreichen, aber nicht unmöglich. Wie wäre es mit der Verwendung eines Stromkodierers wie RC5. Im Internet sollte es genügend Codebeispiele für PHP und C# geben. Dann hättest du per Skript eine schonende Verschlüsselung aufgebaut, mit dem du das gesalzene Passwort zur Authentifizierung senden könntest.
    Unter welchen Suchbegriffen sollte ich denn dazu etwas finden? Bisher habe ich nichts vernünftiges bei Google gefunden.
  15. a******n

    Also ich habe nach "source code php" oder "source code c#" gesucht und wurde nach eine kurzen Weile fündig. Quelltext für C# gibt es hier

    http://www.bearcave.com/cae/chdl/rc5.html oder
    http://www.codeproject.com/KB/cs/Rc5_Encryption.aspx,

    wobei ich Ersteres übersichtlicher finde. Wie ich aber erfahren musste, musst du für die Verwendung von RC5 Gebühren bezahlen (zumindestens falls du es offiziell machst oder so). Besser ist es jedoch, wenn du gleich auf AES übergehst. Dann kannst du auch schon implementierte Funktionen in PHP nutzen wie Mcrypt http://de.php.net/mcrypt (Wie ich schon gesehen habe, ist das Modul auf Lima-City bereits installiert). Und analog für C# findest du passenden Code unter

    http://www.codeproject.com/KB/recipes/Simple_Cryptographer.aspx.

    Die Implementierung ist nun dir überlassen: AES ist deutlich schwerer zu implementieren als RC5. Auf jeden Fall steht Arbeit an :slant:.
  16. Die eigentlich sicherste Methode finde ich selbst das "Tunneln". Das heißt, das du nicht die Datenbank auf direktem Wege kontaktierst, sondern in Wirklichkeit ein PHP-Script anlegst, welches die Anfrage weiterleitet. EMS Database Manager hatte da mal eine Datei namens emsproxy.php.
    Sind etwa 9 KB gewesen, allerdings mit unverschlüsselter Verbindung.
    Ich hab die Datei sogar noch da, falls du sie dir abkopieren möchtest:

    <?
        header('Content-Type: application/octet-stream');
         
        error_reporting(125);
        $data = '';
         
        function err( $error )
        {
        die("err: $error");
        }
         
        function myerr()
        {
        $e = mysql_error();
        mysql_free_result( mysql_query( 'ROLLBACK' ) );
        err( $e );
        }
         
        function pgerr( $err )
        {
        $e = pg_last_error();
        if( $e == '' ) $e = $err;
        if( $e == '' ) $e = 'unknown pgsql error';
        pg_free_result( pg_query( 'ROLLBACK' ) );
        err( $e );
        }
         
         
        function dump( $val )
        {
        global $data;
        $len = strlen($val);
        if( $len < 255 )
        $data .= chr($len);
        else
        $data .= "\xFF".pack('V',$len);
        $data .= $val;
        }
         
         
        array_key_exists('server',$_POST) and array_key_exists('host',$_POST) and array_key_exists('port',$_POST) and array_key_exists('user',$_POST) and array_key_exists('password',$_POST) and array_key_exists('dbname',$_POST) or err("mailformed request");
         
        if( get_magic_quotes_gpc() )
        foreach( $_POST as $key => $value )
        $_POST[$key] = stripslashes($value);
         
         
        $commit = array_key_exists('commit',$_POST);
         
        if( $_POST['server'] == 'mysql' ) {
         
        $host = $_POST['host'];
        if( $_POST['port'] )
        $host .= ':'.$_POST['port'];
        $conn = mysql_connect($host,$_POST['user'],$_POST['password']) or myerr();
        if( $_POST['dbname'] != '' )
        mysql_select_db( $_POST['dbname'] ) or myerr();
         
        $result = FALSE;
        mysql_free_result( mysql_query( 'BEGIN' ) );
        for( $rn = 1; $rn < 1000; ++$rn ) {
        if( !array_key_exists( 'r'.$rn, $_POST ) )
        break;
        $data = '';
        $req = $_POST['r'.$rn];
        if( $req == 'connect' ) {
        dump( mysql_get_server_info() );
        dump( mysql_get_client_info() );
        dump( mysql_get_proto_info() );
        dump( mysql_get_host_info() );
        } else {
        $result = mysql_query($req) or myerr();
        if( $result === TRUE ) {
        dump( 0 );
        dump( mysql_affected_rows() );
        } else {
        $width = mysql_num_fields($result);
        $height = mysql_num_rows($result);
        dump($width);
        dump($height);
        for( $i = 0; $i < $width; ++$i ) {
        dump( mysql_field_name( $result, $i ) );
        $type = mysql_field_type( $result, $i );
        $len = mysql_field_len( $result, $i );
        $meta = mysql_fetch_field( $result, $i );
        $sflags = explode( ' ', mysql_field_flags ( $result, $i ) );
        $fl = 0;
        if( $meta->not_null ) $fl += 1;
        if( $meta->primary_key ) $fl += 2;
        if( $meta->unique_key ) $fl += 4;
        if( $meta->multiple_key ) $fl += 8;
        if( $meta->blob ) $fl += 16;
        if( $meta->unsigned ) $fl += 32;
        if( $meta->zerofill ) $fl += 64;
        if( in_array( 'binary', $sflags ) ) $fl += 128;
        if( in_array( 'enum', $sflags ) ) $fl += 256;
        if( in_array( 'auto_increment', $sflags ) ) $fl += 512;
        if( in_array( 'timestamp', $sflags ) ) $fl += 1024;
        if( in_array( 'set', $sflags ) ) $fl += 2048;
        if( $type == 'int' ) {
        if( $len > 11 ) $type = 8; # LONGLONG
        elseif( $len > 9 ) $type = 3; # LONG
        elseif( $len > 6 ) $type = 9; # INT24
        elseif( $len > 4 ) $type = 2; # SHORT
        else $type = 1; # TINY
        } elseif( $type == 'real' ) {
        if( $len == 12 ) $type = 4; # FLOAT
        elseif( $len == 22 ) $type = 5; # DOUBLE
        else $type = 1; # DECIMAL
        } elseif( $type == 'null' ) $type = 6; # NULL
        elseif( $type == 'timestamp' ) $type = 7; # TIMESTAMP
        elseif( $type == 'date' ) $type = 10; # DATE
        elseif( $type == 'time' ) $type = 11; # TIME
        elseif( $type == 'datetime' ) $type = 12; # DATETIME
        elseif( $type == 'year' ) $type = 13; # YEAR
        elseif( $type == 'blob' ) {
        if( $len > 65536 ) $type = 251; # LONG BLOB
        elseif( $len > 255 ) $type = 252; # BLOB
        else $type = 249; # TINY BLOB
        } elseif( $type == 'string' ) $type = 253; # VARCHAR
        else
        $type = 252;
        dump( $type );
        dump( $fl );
        dump( $len );
        }
        for( $i = 0; $i < $height; ++$i ) {
        $row = mysql_fetch_row( $result );
        for( $j = 0; $j < $width; ++$j )
        if( is_null($row[$j]) )
        dump( '' );
        else
        dump( ' '.$row[$j] );
        }
        mysql_free_result( $result );
        }
        }
        }
        mysql_free_result( mysql_query( $commit ? 'COMMIT' : 'ROLLBACK' ) );
         
        } elseif( $_POST['server'] == 'pgsql' ) {
         
        $conn = '';
        if( $_POST['host'] != '' ) $conn .= "host=$_POST[host]";
        if( $_POST['port'] != '' ) $conn .= " port=$_POST[port]";
        if( $_POST['dbname'] != '' ) $conn .= " dbname=$_POST[dbname]";
        if( $_POST['user'] != '' ) $conn .= " user=$_POST[user]";
        if( $_POST['password'] != '' ) $conn .= " password=$_POST[password]";
        $conn = pg_connect( $conn ) || pgerr('some connection error');
         
        if( !$commit || array_key_exists( 'r2', $_POST ) )
        pg_free_result( pg_query( 'BEGIN' ) );
        $result = FALSE;
        for( $rn = 1; $rn < 1000; ++$rn ) {
        if( !array_key_exists( 'r'.$rn, $_POST ) )
        break;
        $data = '';
        $req = $_POST['r'.$rn];
        if( $req == 'connect' ) {
        dump( 0 );
        dump( 0 );
        dump( 0 );
        } elseif( substr($req,0,11) == 'blob_create' ) {
        list($oid) = sscanf( $req, 'blob_create %u' );
        pg_free_result( pg_query( $commit ? 'COMMIT' : 'ROLLBACK' ) );
        pg_free_result( pg_query( 'BEGIN' ) );
        $oid = pg_lo_create() or pgerr('lo_create failed');
        pg_free_result( pg_query( 'COMMIT' ) );
        pg_free_result( pg_query( 'BEGIN' ) );
        dump($oid);
        } elseif( substr($req,0,11) == 'blob_delete' ) {
        list($oid) = sscanf( $req, 'blob_delete %u' );
        $oid = pg_lo_unlink($oid) or pgerr('lo_unlink failed');
        } elseif( substr($req,0,10) == 'blob_write' ) {
        list($oid) = sscanf( $req, 'blob_write %s ' );
        $bin = substr($req,12+strlen($oid));
        $obj = pg_lo_open($oid,'w') or pgerr( 'lo_open failed' );
        $res = pg_lo_write($obj,$bin) or pgerr( 'lo_write failed' );
        pg_lo_close($obj);
        dump($res);
        } elseif( substr($req,0,9) == 'blob_read' ) {
        list($oid) = sscanf( $req, 'blob_read %u' );
        $obj = pg_lo_open($oid,'r') or pgerr( 'lo_open failed' );
        pg_lo_seek($obj,0,PGSQL_SEEK_END);
        $len = pg_lo_tell($obj);
        pg_lo_seek($obj,0,PGSQL_SEEK_SET);
        $res = pg_lo_read($obj,$len) or pgerr( 'lo_read failed' );
        pg_lo_close($obj);
        dump($res);
        } else {
        $result = pg_query($req) or pgerr("error at request: $req");
        if( pg_result_status($result) == PGSQL_COMMAND_OK ) {
        dump( 0 );
        dump( pg_affected_rows($result) );
        dump( pg_last_oid($result) );
        pg_free_result($result);
        } elseif( pg_result_status($result) == PGSQL_EMPTY_QUERY ) {
        dump( 0 );
        dump( 0 );
        pg_free_result($result);
        } elseif( pg_result_status($result) == PGSQL_TUPLES_OK ) {
        $width = pg_num_fields($result);
        $height = pg_num_rows($result);
        dump($width);
        dump($height);
        for( $i = 0; $i < $width; ++$i ) {
        $type = pg_field_type( $result, $i );
        dump( pg_field_name( $result, $i ) );
        dump( $type );
        dump( pg_field_size( $result, $i ) );
        }
        for( $i = 0; $i < $height; ++$i ) {
        $row = pg_fetch_row( $result );
        for( $j = 0; $j < $width; ++$j )
        if( is_null($row[$j]) )
        dump( '' );
        else
        dump( ' '.$row[$j] );
        }
        pg_free_result( $result );
        } else {
        $e = pg_result_error($result);
        pg_free_result($result);
        err( $e );
        }
        }
        }
        pg_free_result( pg_query( $commit ? 'COMMIT' : 'ROLLBACK' ) );
         
        } else {
        err("server type '$_POST[server] is not supported");
        }
         
        echo('OK:' . $data);
        ?>


    (Soll jetzt nur als Tunnelbeispiel gedacht sein. Hier wird aber auch entsprechend nach dem DB-Passwort gefragt)

    Du müsstest den Code entsprechend anpassen, oder zumindest mal als Idee auffassen. Zusätzlich kannst du dann im Programm, sowie im Script eine Zweiseitige Verschlüsselung einbauen (als blödes Beispiel Blowfish). Der Vorteil an der Methode sehe ich dadrin, das das wirkliche DB-Passwort nur zwischen PHP-Script und Datenbank bekannt ist, und deine Anwendung ein Dummy-Passwort nutzt, was zur Verifizierung am PHP-Script dient. Sonstige Lösungen wären ja nur noch Arten von SSL, aber ob du dir solche teuren Lizenzen kaufen möchtest, bezwifel ich (zudem macht es das ganze noch viel schwerer).
  17. heroes-of-legends

    heroes-of-legends hat kostenlosen Webspace.

    Du solltest auf keinen fall passwörter, ob unverschlüsselt oder nicht ist egal, in einer c# exe speichern. Da jeder .NET code nur in Intermediate Language übersetzt wird (ähnlich dem Bytecode von Java) ist es möglich den code zu disassemblieren. Kommunikation zwischen einem Server-Client-Programm und dem Server sollte grundsätzlich über Webservices geschehen. Somit ist sichergestellt, das der nutzer nur gewünschte funktionen zur verfügung gestellt bekommt. (In dem fall dein Clientprogramm) Beispiele hierzu solltest du in unmengen bei Google finden, wobei ich bei Micrososft Themen dazu rate Bing zu nutzen (Mit einer Windows Live ID eingeloggt sein bringt hier vorteile, da man auch Suchergebnisse aus geschützten bereichen findet.).
  18. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    Mit Programmen wie Wireshark, kann jede Anfrage, egal ob verschlüsselt oder nicht, exakt dupliziert und reproduziert werden. Die einzige "sichere" Variante ist a) Passwörter zu generieren, die abhängig vom Zeitpunkt nur eine begrenzte Gültigkeit besitzen und b) den erzeugten IL-Code in vollwertigen Maschinencode zu übersetzen, wenn möglich natürlich mit einer umfassenden Obfuscation, sowie Schutzmaßnahmen, um ein Disassembling zu verhindern.

    Trotzdem: Wir sprechen hier nicht über Weltkriegspläne, sondern über einen kleinen Chat, also mach dir nicht zu viele Gedanken darüber. Häuser werden für Diebe interessant, wenn Gitter vor den Fenstern sind, verstehst du was ich meine ? Also überleg dir eine mittelprächtige Variante und vertraue darauf, dass sich keiner die Arbeit macht, nur um später mal in fremde Accounts einzudringen oder Ähnliches. Denn das lohnt sich dann schlicht und ergreifend nicht mehr.

    Liebe Grüße
    - VampireSilence
  19. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    Cool das meine Frage hier so ausführlich besprochen wird.
    Ich habe mir mittlerweile eine API site geschrieben und muss somit nicht die sql Verbindung in der exe herstellen.
    Klappt alles wunderbar :)
    LG
  20. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!