kostenloser Webspace werbefrei: lima-city


Suche auf lima-city

  • in: PHP | openssl_decrypt() gibt FALSE zurück, warum?

    geschrieben von adelwoehrer

    Um das zu erklären, poste ich erstmal den ursprünglichen (falschen) Code, den ich in C++ zur Encryption verwendet hatte.
    QByteArray Crypto::Encrypt(QByteArray source, QString password)
    {
      EVP_CIPHER_CTX en;
    
      unsigned char *key_data;
      int key_data_len;
    
      QByteArray ba = password.toLatin1();
      key_data = (unsigned char*)ba.data();
      key_data_len = strlen((char*)key_data);
    
      int nrounds = 28;
      unsigned char key[32], iv[32];
    
      EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), NULL, key_data, key_data_len, nrounds, key, iv);
    
      EVP_CIPHER_CTX_init(&en);
      EVP_EncryptInit_ex(&en, EVP_aes_256_cbc(), NULL, key, iv);
    
      char *input = source.data();
      char *out;
      int len = source.size();
    
      int c_len = len + 16, f_len = 0;
      unsigned char *ciphertext = (unsigned char *)malloc(c_len);
    
      EVP_EncryptInit_ex(&en, NULL, NULL, NULL, NULL);
      EVP_EncryptUpdate(&en, ciphertext, &c_len, (unsigned char *)input, len);
      EVP_EncryptFinal_ex(&en, ciphertext+c_len, &f_len);
    
      len = c_len + f_len;
    
      out = (char*)ciphertext;
    
      EVP_CIPHER_CTX_cleanup(&en);
    
      return QByteArray(out, len);
    }


    Nach etlichen Versuchen und rumprobieren, haben wir rausgefunden, dass die Funktion EVP_BytesToKey() einen IV liefert, wenn ich int nrounds = 28; auf eine beliebige andere Zahl ändere.
    Erst gab es also die Vermutung, dass die 28 Runden mit dem Key kombiniert einfach aus Zufall genau einen Null-IV berechnen.
    Es schaffte dann zwar Abhilfe, die Runden auf 5 zu ändern, im Nachhinein lieferte PHP aber zusammen mit dem richtigen Klartext die entscheidende Warnmeldung.

    Warning: openssl_decrypt(): IV passed is 17 bytes long which is longer than the 16 expected by selected cipher, truncating in /var/www/aestest.php on line 9
    12345678901234567890123456789012abc


    Das eigentliche Problem lag daran, dass das IV-Array mit 256 Bits definiert war, aber nur 128 Bits haben durfte.
    Der Grund für den Fehler lag also auch nicht an den Runden, sondern hier: unsigned char key[32], iv[32];
    Richtig lauten würde es nämlich so: unsigned char key[32], iv[16];
    Was jetzt auch logisch erscheint, da die Länge unten mit 16 addiert wird.
    Es war also prinzipiell ein Fehler im Tutorial.

    Nachdem das also geklärt war, hab ich trotzdem von der Funktion EVP_BytesToKey() Abstand genommen, da ich einfach nicht weiß, was der da im Hintergrund ausrechnet.
    Verblieben bin ich also mit folgendem Code.
    QList<QByteArray> Crypto::Encrypt(QByteArray source, QByteArray password)
    {
        QList<QByteArray> result;
    
        Keys keys;
        QByteArray randIV = keys.generateRandom(16, NULL);
    
        unsigned char* key = (unsigned char*) password.constData();
        unsigned char* iv = (unsigned char*) randIV.constData();
    
        result.append(fromBase64ToUrl(QByteArray((const char*) iv).toBase64()));
    
        EVP_CIPHER_CTX en;
    
        EVP_CIPHER_CTX_init(&en);
        EVP_EncryptInit_ex(&en, EVP_aes_256_cbc(), NULL, key, iv);
    
        char *input = source.data();
        int len = source.size();
    
        int c_len = len + 16, f_len = 0;
        unsigned char *ciphertext = (unsigned char *)malloc(c_len);
    
        EVP_EncryptUpdate(&en, ciphertext, &c_len, (unsigned char *)input, len);
        EVP_EncryptFinal_ex(&en, ciphertext+c_len, &f_len);
    
        len = c_len + f_len;
    
        result.append(fromBase64ToUrl(QByteArray((char*)ciphertext, len).toBase64()));
    
        EVP_CIPHER_CTX_cleanup(&en);
    
        return result;
    }

    Der einzige Unterschied ist hier, dass ich den IV explizit mit einer Random-Funktion und 128 Bits erstelle und dann eine Liste mit Ciphertext und IV zurückgebe.
    Ist so sauberer und der Code ist kürzer.

    Danke auch an czibere für die Hilfe.
    Problem sollte damit gelöst sein.
  • in: PHP | openssl_decrypt() gibt FALSE zurück, warum?

    geschrieben von adelwoehrer

    ich frage mich nur, warum glaubst, dass von openssl auf mcrypt umzusteigen dein problem lösen wird?

    Habe gehört, dass das Padding eventuell unterschiedlich gehandhabt wird....keine Ahnung ehrlich....trial and error halt, wollts nur versuchen.
    Es kommt bei beiden Methoden derzeit das Gleiche raus, openssl und mcrypt....ich hab den Code für openssl ja noch, können damit auch weitermachen.
    Ich schein nur nicht zu verstehen, was ich mit dem IV anfangen soll.

    du hast ja in dem encrypt-teil (c/cpp) von dir ein 'iv'. genau dieses 'iv' ist ein null-terminierter string!
    jetzt kommts ;) genau dieses null-terminierte 'iv' sollst du statt

    "\0\0\0\0\0....usw."

    in zeile 23 einsetzen und nicht IRGENDEINEN string mit '0' am ende oder gar laute binäre nullen in einer wurst.

    Das Problem liegt hier darin, dass ich diesen Null-Terminierten string nicht in ein sinnvolles Format bekomm, um ihn in PHP verwenden zu können.

    In meinem C++ Code hab ich die Funktion:
    EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), NULL, key_data, key_data_len, nrounds, key, iv);


    Wenn ich das ausführe, SOLLTE die Variable "key" jetzt eigentlich den binären Key enthalten, die Variable "iv" den IV.
    Damit ich das sinnvoll an PHP übergeben kann (via GET) , caste ich das von nem unsigned char* zu nem const char*, schreib das in ein ByteArray und encode es mit Base64.

    QByteArray bkey = reinterpret_cast<const char*>(key)
    QByteArray biv = reinterpret_cast<const char*>(iv)
    
    QByteArray bkey2 = bkey.toBase64().
    QByteArray biv2 = biv.toBase64().


    In bkey2 steht dann der Key, den ich in PHP verwendet habe.
    In biv2 steht NICHTS drinnen....der reinterpret_cast gibt schon nichts zurück. (Soll das so sein?)
    Das ist leer....

    Ich versteh nicht?
    Was vom iv soll ich da übergeben?
    Es ist nichts da, was ich übergeben kann?

    Schau Dir bitte mal den Debug an: http://img689.imageshack.us/img689/1475/43bw.png
  • in: PHP | openssl_decrypt() gibt FALSE zurück, warum?

    geschrieben von adelwoehrer

    Mein PHP sieht jetzt mal so aus:
    <?php
    function decrypt_data($data, $iv, $key) {
        $cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
    
        // initialize encryption handle
        if (mcrypt_generic_init($cypher, $key, $iv) != -1) {
                // decrypt
                $decrypted = mdecrypt_generic($cypher, $data);
    
                // clean up
                mcrypt_generic_deinit($cypher);
                mcrypt_module_close($cypher);
    
                return $decrypted;
        }
    
        return false;
    }
    
    $ctext = "CiUqILbZo+WJBr19IiovRVc1dqGvrastwo0k67TTrs51HB8AbJe8S4uxvB2D7Dkr";
    $key = "aQkrZD/zwMFU0VAqjYSWsrkfJfS28pQJXym20UEYNnE=";
    
    $res = decrypt_data(base64_decode($ctext), "\0\0\0\0\0....usw.", base64_decode($key));
    
    echo $res;
    ?>


    Das mit den "\0" ist doch, was mit null'ed out gemeint war, oder lieg ich da falsch?
    Zumindest hab ich das in google so gefunden.
    Die Anzahl der Nullen ändert da leider gar nichts.
    Ob ich jetzt einmal oder 32 mal "\0" in den iv schreib kommt aufs Gleiche raus.
    Wenn ich es einfach auf "null" lasse, hab ich halt wieder andere Steuerzeichen davor.
    Der hintere Teil bleibt wie gehabt, aber die vordere Hälfte wird mir nun halt als zufällige Steuerzeichen angezeigt, anstatt gar nicht.

    Also anstatt 7890123456789012abc jetzt eben 1sC@]’ö¿Š4Kt¯æ$‰7890123456789012abc.
  • in: PHP | openssl_decrypt() gibt FALSE zurück, warum?

    geschrieben von adelwoehrer

    Ja, das hab ich gemacht.
    Jetzt zeigt er mir die vorderen Zeichen zwar an, allerdings als zufällige Sonderzeichen, nicht decrypted.
  • in: PHP | openssl_decrypt() gibt FALSE zurück, warum?

    geschrieben von adelwoehrer

    Hallo czibere,

    danke für Deine Antwort.

    Ich benutze zur Erstellung des Keys und des IVs eine OpenSSL Funktion, sollte das also nicht selbst machen müssen, außer ich verstehe die Logik dahinter nicht, was gut sein kann.

    Ganz konkret nutze ich die EVP_BytesToKey() Funktion, die mir anhand des Passworts und der mitgegebenen Daten einen Key und einen IV generieren sollte.
    EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), NULL, key_data, key_data_len, nrounds, key, iv);


    key_data ist hier mein Passwort (1hA!dh==sJAh48S8Ak!?skiitFi120xX)
    Daraus, und aus nrounds (28) sollte er mir in die Variablen key und iv den Output geben.

    Die Variablen key und iv sind Anfangs unsigned char* Datentypen, ich muss beide also erst in const char* umwandeln, um sie in ein ByteArray speichern und an PHP übergeben zu können.
    Das mache ich mit: QByteArray bkey = reinterpret_cast<const char*>(key) und QByteArray bvi = reinterpret_cast<const char*>(iv).

    Das Problem hier ist....bkey enthält dann ordnungsgemäß den richtigen Key zum entschlüsseln, den ich auch verwendet habe. (siehe erster Post)
    Aber biv ist null....ich ging also davon aus, dass ich keinen iv brauche.
    Vielleicht kann ich ihn aber nur nicht mit reinterpret_cast umwandeln?!?

    Für den gesamten Code bzw. etwas Codehighlighting hätte ich die Frage auch auf stackoverflow gestellt: http://stackoverflow.com/questions/18312657/aes-encrypt-with-openssl-decrypt-with-mcrypt
    Dort hab ich aber mit mcrypt decrypten versucht, allerdings das gleiche Problem mit dem abgeschnittenen Ergebnis....sollte also der selbe Fehler sein.

    Danke mal für Deine Hilfe.
  • in: PHP | openssl_decrypt() gibt FALSE zurück, warum?

    geschrieben von adelwoehrer

    Ich habe etwas Text mit der OpenSSL Library in C++ verschlüsselt.
    Nun möchte ich diesen Text mit der OpenSSL Library in PHP wieder entschlüsseln, allerdings liefert mir die Funktion (openssl_decrypt()) ständig false zurück.

    <?php
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    
    $ctext = "CiUqILbZo+WJBr19IiovRVc1dqGvrastwo0k67TTrs51HB8AbJe8S4uxvB2D7Dkr";
    $key = "aQkrZD/zwMFU0VAqjYSWsrkfJfS28pQJXym20UEYNnE=";
    
    if($test = openssl_decrypt($ctext, 'aes-256-cbc', $key))
    {
    	echo $test;
    }
    else
    {
    	echo "fail";
    }
    ?>


    Sowohl der encryptete Text (cText) als auch der Key (key) sind Base64 encoded.
    Ich erhalte keine Errormeldungen, OpenSSL ist installiert und funktioniert einwandfrei (getestet).
    Laut Funktionsbeschreibung wird false zurückgegeben, wenn die Decryption fehlschlägt....aber was kann die Decryption fehlschlagen lassen?
    Im schlechtesten Fall sollte er mir doch zumindest etwas Kauderwelsch liefern, wenn am Key oder Text was falsch wäre?!?

    Kann sich jemand einen Reim darauf machen und mir kurz weiter helfen?



    EDIT:

    Anscheinend akzeptiert die Funktion keine Base64-encodeten Keys....habe also nun den Key mittels "base64_decode(key)" übergeben und er liefert mir nun ein Ergebnis.
    Das Problem, was ich jetzt habe....der Text ist nur zur Hälfte entschlüsselt? o.O

    Herauskommen sollte: "12345678901234567890123456789012abc"
    Bekommen tu ich: "7890123456789012abc"

    Die Decryption scheint also zu funktionieren, aber wieso liefert der mir nur den hinteren Abschnitt?
    Key und Text sind genau die selben, die ich auch in der OpenSSL-Shell verwendet hab....da macht er's richtig.

    Aktueller Code:
    <?php
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    
    $ctext = "CiUqILbZo+WJBr19IiovRVc1dqGvrastwo0k67TTrs51HB8AbJe8S4uxvB2D7Dkr";
    $key = base64_decode("aQkrZD/zwMFU0VAqjYSWsrkfJfS28pQJXym20UEYNnE=");
    
    if($test = openssl_decrypt($ctext, 'aes-256-cbc', $key))
    {
    	echo $test;
    }
    else
    {
    	echo "fail";
    }
    ?>
  • in: Dateidownload nur über PHP-Script

    geschrieben von adelwoehrer

    Ich verwende derzeit folgendes PHP-Script, um vor dem Download-Start einer Datei von meinem Server einen Download-Zähler hochzuzählen.
    <?php
    $path="./downloads/";
    
    $f = @strip_tags($_GET['f']);
    
    if ($f!="")
    {
      $dir_handle = @opendir($path) or die("Unable to open ".$path);
      while ($file = readdir($dir_handle))
      {
        if (!is_dir($file))
        {
          if ($file==$f)
          {
            rename($path.$file,$path."0:0:".$file);
            $file = "0:0:".$file;
          }
    
          $fparts = preg_split('/:/',$file);
    
          if ((count($fparts)>1) && ($fparts[2]==$f))
          {
            $dlcount = intval($fparts[0])+1;
            $frandom = hash("md5",microtime());
            $newfilename=$dlcount.":".$frandom.":".$f;
    
            rename($path.$file,$path.$newfilename);
    
            break;
          }
        }
      }
    
      if (isset($newfilename) && ($newfilename!=""))
      {
        header('Content-type: application/zip');
        header('Content-Disposition: attachment; filename="'.$f.'"');
        header("Content-Transfer-Encoding: binary");
        readfile($path.$newfilename);
      }
    
    }
    ?>


    Der Download wird dann halt zum Beispiel mit "http://domainname.at/download.php?f=dateiname.zip" gestartet.

    Der Code funktionierte für meine bisherigen Zwecke sehr gut, hatte den Zähler direkt im Dateinamen und vergab auch gleich immer einen Zufalls-Hash, um einen direkten Link auf die Datei unmöglich zu machen.
    Ich habe in letzter Zeit aber festgestellt, dass das "readfile()" Kommando von PHP bei größeren Dateien nicht zu funktionieren scheint.
    Bei meinen derzeitigen Tools, die meist nur ein paar hundert KB an Größe hatten, funktionierte der Download einwandfrei.
    Sobald die Dateien aber eine Größe von mehreren MB annehmen, und ich dann versuche, sie über das Script runterzuladen, wird zwar der Zähler hochgezählt, aber ich erhalte nur eine weiße Seite und es passiert nichts. (Download startet nicht)

    Das scheint eine Art Größenbegrenzung für PHP-Downloads zu sein?!?
    Ich habe dazu nirgends einen Parameter gefunden, den man größenmäßig anpassen könnte, sowie das in der "php.ini" ja auch mit der Upload-Größe machbar währe.

    Ich habe mir allerdings überlegt, erst mittels htaccess den direkten Zugriff auf die Datei zu Blocken....z.B.:
    <Files "dateiname.zip">
    Deny from all
    </Files>

    ....und nur den Redirect auf diese Datei mittels PHP-Script zu erlauben....
    <?php
    
       header( 'Location: http://domainname.at/downloads/dateiname.zip' ) ;
    
    ?>


    Da könnte ich dann vorher noch eine Zählfunktion einbauen.
    Würde das funktionieren, oder würde dieser Redirect als ganz normaler Zugriff via Browser gewertet werden und auch über htaccess geblockt werden?
    Wie mach ich das am besten, dass der Download nur über das PHP-Script klappt?
  • in: Dateisperren für Downloadzähler

    geschrieben von adelwoehrer

    Denkfehler meinerseits....der Befehl zum Sperren der Datei gibt ja auch bool zurück.
    In diesem Sine schlägt dann spätestens das Kommando fehl, wenn die Prüfung nicht klappt.

    Danke, Problem gelöst.
  • in: Dateisperren für Downloadzähler

    geschrieben von adelwoehrer

    Ah, also einfach bei Fehlschlag eines locks ein sleep() und danach nochmal versuchen.
    Das löst das erste Problem mit dem gleichzeitigen Dateizugriff, danke.

    Was jetzt noch bleibt, ist die Frage, ob das hier theoretisch passieren könnte, wenn zeitgleich auf die Datei zugegriffen wird:

    - Script 1 öffnet die Datei
    - Script 2 öffnet die Datei
    - Script 1 prüft Sperre (nicht gesperrt)
    - Script 2 prüft Sperre (bevor Datei von Script 1 gesperrt wurde) (nicht gesperrt)
    - Script 1 sperrt Datei

    In diesem Fall würde das sleep() nicht getriggert werden, weil beide Scripte das "Go" zum Sperren haben.
  • in: Dateisperren für Downloadzähler

    geschrieben von adelwoehrer

    Ich versuche derzeit einen Downloadzähler innerhalb einer normalen Textdatei anzulegen.
    Das stellt von der Programmierung her kein Problem dar, ich hab da allerdings eine Frage zu den Dateisperren.
    PHP sperrt Dateien ja nicht von sich aus, solange man das nicht explizit per Kommando angibt, oder?

    Was ich vermeiden möchte, ist bei einem eventuell auftrenden gleichzeitigen Zugriff zum Erhöhen des Zählers ein Scenario wie dieses:

    Angenommen, die Zahl in der Datei lautet 42.
    - Script 1 öffnet die Datei
    - Script 1 liest den Inhalt der Datei aus, weiß, dass der Zähler 42 ist
    - Script 2 öffnet die Datei
    - Script 1 löscht den Inhalt der Datei
    - Script 2 liest den Inhalt der Datei aus - und stellt fest: sie ist leer, nimmt daher 0 an
    - Script 1 schreibt 43 in die Datei
    - Script 1 schließt die Datei
    - Script 2 löscht den Inhalt der Datei
    - Script 2 schreibt 1 in die Datei
    - Script 2 schließt die Datei

    Um die Datei zu sperren, habe ich in PHP nun folgendes Kommando entdeckt:

    bool flock (resource $handle, int $operation [, int &$wouldblock])
    Als $handle wird dann einfach der Wert von "fopen()" übergeben.
    Das Attribut $operation beschreibt einfach, ob die Datei gesperrt oder entsperrt werden soll.
    Das Attribut $wouldblock soll laut Anleitung angeben, ob das zweite Script auf das entsperren warten, oder abgebrochen werden soll.

    Frage: Wie lange würde das zweite Script warten? Gibts hier ein Timeout?

    Desweiteren fällt mir zum Sperren dann noch folgendes Scenario ein.
    Was wäre, wenn beide Scripte die Datei bereits geöffnet hatten, bevor eines von beiden sie sperren konnte....also wenn der Zugriff wirklich extrem zeitgleich verlief.

    Beispiel:

    - Script 1 öffnet die Datei
    - Script 2 öffnet die Datei
    - Script 1 sperrt die Datei

    Das ist wohl sehr unwarscheinlich, dass das so zustande kommt....aber ist es möglich?


    Wie würdet ihr sowas am besten anstellen?
    Ich will für einen reinen Downloadzähler den Benutzer nicht zwingen müssen, eine Datenbank zu installieren, nur um die Abfragen in Warteschleifen packen zu können.
    Ich will mich hier auch von SQLite fernhalten....mir erscheint der Aufwand für sowas simples wie einen Downloadzähler da einfach zu hoch.
  • in: PHP - Neuen Benutzer auf Debian System anlegen

    geschrieben von adelwoehrer

    Liegt in "/usr/sbin/", ja.
    Hab den Link mal im C-Program vollständig eingefügt (/usr/sbin/useradd).
    Nun findet er den useradd-Befehl, schreibt mir aber eine andere Fehlermeldung: "useradd: /etc/passwd konnte nicht gesperrt werden, versuchen Sie es später noch einmal."

    Ist das jetzt ein Rechteproblem?


    EDIT:
    War meine Schuld.....nachdem ich useradd direkt verlinkt hab, hatte ich vergessen, nach dem neuen Kompilieren die suid wieder zu setzen.
    Es funktioniert Alles....danke. :-)
  • in: PHP - Neuen Benutzer auf Debian System anlegen

    geschrieben von adelwoehrer

    Habe jetzt mal debian fertig installiert, apache und php drauf gepackt und die C-Datei kompiliert.
    Besitzer ist root, suid ist gesetzt.

    In PHP hab ich mal der Einfachheit halber keine Variablen verwendet, sondern das Kommando direkt ausgeführt.

    test.php
    <?php
    shell_exec("mkuser testbenutzer testpasswort;");
    ?>


    Wenn ich jetzt als root über den Befehl "php5 test.php" das Script ausführe, wird der Benutzer angelegt.
    Wenn ich nun aber auf einen Benutzer ohne Admin-Rechte am System wechsle, und das selbe mache, schreibt er mir die Meldung: "sh: useradd: not found"

    Woran liegt das?
  • in: PHP - Neuen Benutzer auf Debian System anlegen

    geschrieben von adelwoehrer

    Was spricht gegen
    setuid(0);
    und
    chown root:root programm; chmod u+s programm
    ?


    Ich fürchte einfach, ich kann dir da nicht ganz folgen.
    Habe bisher immer nur mit Scripts auf Linux Systemen gearbeitet.
    Wie genau würde dieses Programm aussehen?
    Was wird dann über PHP übergeben?
    Wie führe ich darüber dann im Endeffekt den useradd Befehl aus?

    Ich downloade grade mal die Virtual Box samt Debian Image, damit ich mal die Vorschläge testen kann.
  • in: PHP - Neuen Benutzer auf Debian System anlegen

    geschrieben von adelwoehrer

    Du könntest die Angaben zum anzulegenden Benutzer in einer Datei hinterlegen und zyklisch ein Script auf dem Server mit root rechten laufen lassen das sich die Daten aus der Datei nimmt und die Nutzer dann anlegt, dann funktioniert das ganze aber nicht sofort sondern eben erst beim nächsten durchlauf des Scripts (was sich aber triggern lassen würde).

    Die Idee hatte ich bereits, hab sie dann aber eben wegen der verspäteten Ausführung der Kommandos wieder verworfen.
    Wie könnte ich denn die Ausführung über PHP triggern?
    Und würde das Triggern ohne Root Rechte funktionieren?
  • in: PHP - Neuen Benutzer auf Debian System anlegen

    geschrieben von adelwoehrer

    SSH-Login von PHP aus als "root" → user anlegen

    Wie würde ich das machen?

    <?php
    $connection = ssh2_connect('shell.example.com', 22);
    ssh2_auth_password($connection, 'username', 'password');
    
    $stream = ssh2_shell($connection, 'vt102', null, 80, 24, SSH2_TERM_UNIT_CHARS);
    ?>


    Mal schnell über google gefunden....würde das funktionieren?
    Entschuldige, dass ich extra frage....aber ich hab im Moment leider nicht die Möglichkeit, es zu testen. :smile:
  • in: PHP - Neuen Benutzer auf Debian System anlegen

    geschrieben von adelwoehrer

    Hallo,

    ich stehe derzeit vor einem kleinen Problem.
    Wir programmieren einen E-Mail Client, der Mails über einen Postfix-Server auf einem Debian System anzeigen soll.
    Zusätzlich soll es einen Admin-Bereich in diesem Client geben, über den man neue Benutzer für den Mail-Server anlegen, verwalten und auch wieder löschen kann.

    Nun ist es aber so, dass zum Anlegen eines neuen Benutzers auf dem Server natürlich root-Rechte erforderlich sind.

    Der Befehl....
    $usr = $_POST['username'];
    $pwd = $_POST['password'];
    
    shell_exec("useradd ".$usr." -s /bin/false -p ".crypt("'".$pwd."'").";");

    ....funktioniert daher nicht, weill "www-data" natürlich keine Admin-Rechte besitzt.

    Nun wurde mir vorgeschlagen, www-data für diesen Zweck einfach Admin-Rechte zu geben....ich halte das aber für eine Sicherheitslücke.
    Aber gibt es denn eine andere Möglichkeit?

    Mir wurde auch geraten, das Root-Passwort in einer Datei am System zu hinterlegen und dann darüber den Befehl auszuführen....das hat aber irgendwie nicht geklappt....bekam ständig die Meldung: "Command needs to be executed from shell"....


    Wie würdet ihr das am besten Lösen?
    Danke schon mal.
  • in: Brauchen wir eine neue Kirche?

    geschrieben von adelwoehrer

    Dass die meisten in Deutschland christlich oder katholisch oder keiner Religion angehören, ist noch lange kein Grund alle anderen Religionen abzulehnen.

    Mit verschiedenen Religionen sind meist auch verschiedene Kulturen verbunden....und natürlich möchte jeder in Sachen "Gott und die Welt" die richtige Antwort gefunden haben.
    Es stört mich persönlich nicht, welche Religionen ausgeübt werden, ob alt oder neu, Christlich oder Islam....die Toleranz von Atheisten den Religionen gegenüber ist meiner Meinung nach sogar größer, als die Toleranz der verschiedenen Religionen untereinander.
    Solange die Glaubensgemeinschaften für sich keine Sonderrechte in der Gesetzgebung einräumen und die Leute nicht wieder anfangen, den Weltuntergang zu predigen, habe ich kein Problem mit einer weiteren neuen Version der Bibel, die näher an der Gegenwart angelehnt ist.
    Lasst nur bitte die Weltuntergansszenarien weck....es hilft sicher nicht, wenn der Großteil der Leute annimmt, dass Die Welt noch in Ihrem Leben ein Ende findet (7 Siegel und die Apokalypse)....zerstört irgendwie die Motivation, die Welt zu verbessern, solange man hier ist....die Leute fangen nur an, überall Zeichen für den Weltuntergang zu sehen.
    Was nach dem Tod kommt....kann jeder für sich entscheiden.

    Soweit mir bekannt ist, geht die Welt in 10 Tagen ja wieder mal unter....
  • in: Geldverdienen mit share if you like

    geschrieben von adelwoehrer

    Hab ich früher zur Genüge gemacht.
    Kurz vor dem Auszahlungsbetrag hören sie auf, Dir Links zum teilen zu schicken oder tracken einfach hin und wieder die Klicks nicht mit.
    Geht lieber am Wochenende Autowaschen oder Rasenmähen, da sind auch 10 € drinnen und Ihr belästigt niemanden mit Werbung.
  • in: Captcha integrieren

    geschrieben von adelwoehrer

    ich habe alle Mögliches Probiert Aber Geht nich

    Was denn zum Beispiel, und wieso geht's nicht?
    Fehlermeldung?

    Was mir noch auffällt....Du hast die Klammern nicht geschlossen. "}"
    Fehlen in beiden Codeblöcken.

    Abgesehen davon....
    // Alle Nicknames und Emailadressen zum Vergleich aus der Datenbank holen
                $sql = "SELECT Nickname, Email FROM User"; 
                $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error()); 
                while($row = mysql_fetch_assoc($result)){ 
                         $nicknames[] = $row['Nickname']; 
                         $emails[] = $row['Email']; 
                }


    Wenn Du ALLE angelegten Namen aus einer Datenbank ziehst, nur um sie gegen zu überprüfen, kannst Du auch genauso gut eine Textdatei verwenden....

    Nimm lieber:
    $sql = "SELECT Nickname, Email FROM User WHERE Nickname = '".mysql_real_escape_string($row['Nickname'])."' AND Email = '".mysql_real_escape_string($row['Email'])."'";

    Dann bekommst Du entweder ein Ergebnis zurück (wenn existiert), oder gar keines und musst keine Schleife abarbeiten.
  • in: Login PHP MySql

    geschrieben von adelwoehrer

    Das lässt sich so nicht vereinheitlichen....Du musst ja auch wissen, wofür Du Punkte vergeben möchtest.
    Bevor Du Dir darüber Gedanken machst, solltest Du erstmal eine funktionierende Seite haben, auf der Deine Benutzer auch Aktionen ausführen können, die Punkte bringen.
    Generell würde ich allerdings einfach für jeden Benutzer, der bei der Registrierung angelegt wird, einfach ein zusätzliches Feld "Points" generieren, dessen Wert Du später einfach updaten kannst.
    Du musst ja nur die Zahl im Feld erhöhen, wenn eine bestimmte Aktion ausgeführt wird.

    Schau Dir hierzu am besten die MySQL Befehle etwas genauer an.
  • in: Qt (C++) Mail Client - Wie Anhänge am besten Speichern?

    geschrieben von adelwoehrer

    Verstehe, gut zu wissen.
    Wir wühlen uns ja grade durch die IMAP-RFC um den Standart möglichst umzusetzen, die verschiedenen Abschnitte der Nachrichten werden allerdings von den meisten Mail-Anbietern ziemlich unterschiedlich getrennt.
    Wenn ich über G-Mail eine Mail an unseren Server verschicke und diese dann über IMAP downloade, ist die Unterteilung der Nachricht noch einigermaßen nachvollziehbar.
    Wenn ich nun allerdings eine Mail über Outlook verschicke, sind da eine Menge zusätzliche Angaben und diese teils doppelt und dreifach angeführt....das lässt sich dann nicht wirklich einheitlich unterteilen und wir können nicht für jeden Anbieter einen eigenen Parser schreiben.

    Wir haben das Problem für Body und Header bereits gelöst....den Nachrichtenteil der Mail kann man über den IMAP-Befehl "BODY[TEXT]" ganz leicht abrufen.
    Gibts da auch sowas wie "BODY[ATTACHEMENTS]"?
  • in: Login PHP MySql

    geschrieben von adelwoehrer

    http://www.mywebsolution.de/workshops/2/show_PHP-Loginsystem.html#up
  • in: Qt (C++) Mail Client - Wie Anhänge am besten Speichern?

    geschrieben von adelwoehrer

    Ich bastle derzeit mit ein paar Leuten zusammen an einer Groupware-Lösung die nun auch einen E-Mail Client enthalten sollte.
    Meine Aufgabe ist unter anderem die lokale Speicherung der Mails auf dem Rechner, nachdem diese vom Server abgerufen wurden.
    Wir würden zur lokalen Speicherung gerne eine SQLite Datenbank verwenden, wir haben uns jetzt allerdings Gedanken darüber gemacht, wie wir da am besten die in den E-Mails mitgeschickten Anhänge mit rein packen.

    Ist es sinnvoll, ein Byte-Array (bzw. Binär-Array) für die entsprechenden Dateien in einer SQLite-Datenbank anzulegen?
    Outlook verwendet für die Mail-Speicherung ja seine eigenen Dateien. (.pst)
    Ansonsten könnte man die Dateien auch einfach lokal in einem entsprechend verschlüsselten Ordner legen und ihnen einfach eine ID für die zugehörige E-Mail zuweisen....ich frage mich allerdings, ob jemand nicht einen Tip für eine schönere Lösung parat hätte.

    Wie könnte ich am besten E-Mails plus Anhänge in einer einzelnen Datenbankdatei (oder Vergleichbares) hinterlegen, damit diese später leicht zu sichern und zu importieren ist?
  • in: C# || Argument mit Leerzeichen an Konsole übergeben

    geschrieben von adelwoehrer

    Die fetten Backslashes musst du entweder selbst nochmal escapen, also \\ schreiben oder du ersetzt sie duch Forwardslashes

    Die sind bereits escaped, ich hab sie im Zitat nur vergessen. =)

    Danke für die Links und Hilfestellungen, ich hab noch etwas herumprobiert und bin dann dahintergekommen, wie es klappt....auch wenn ich nicht weiß, wieso es so klappt.
    Vielleicht fällt euch dazu was ein.

    Also die Syntax ist ja wie schon gesagt: Pfad zum Program --market Pfad zur Cache-Datei > Pfad zur Ausgabedatei
    Wenn ich nun alle Pfade escape, funktioniert es nicht.
    Wenn ich keinen der Pfade escape, funktioniert das auch nicht.
    Was ich tun muss, ist, den Pfad zum Programm nicht zu escapen (auch wenn Leerzeichen drinnen sind) und die anderen beiden Pfade zu escapen.

    Also: Pfad zum Program --market \"Pfad zur Cache-Datei\" > \"Pfad zur Ausgabedatei\"

    Ich kann mir das nur so zusammenreimen, dass die Windows-Konsole den Programm-Pfad nur unescaped aufrufen kann (keinen Schimmer wieso) und die beiden anderen Pfade dann im Endeffekt an das eignetliche Programm übergeben werden, dass dann aber wiederrum escapte Pfade braucht.
    Alles ein bisschen aufwendig, funktioniert so aber.

    Danke mal für die Hilfe. =)
  • in: C# || Argument mit Leerzeichen an Konsole übergeben

    geschrieben von adelwoehrer

    Ich google nun schon eine Weile nach einer Lösung, bisher hat aber nichts geklappt.
    Ich würde gerne über C# eine Konsolenanwendung starten und ihr Argumente übergeben (Pfade), die allerdings Leerzeichen enthalten.
    Mir ist bewusst, dass man Pfadangaben, die Leerzeichen enthalten, in Anführungszeichen setzen soll.
    Das funktioniert auch, aber nur wenn ich die Konsole per Hand starte und danach die Pfade übergebe.
    Wenn ich die Konsole via C# starte und die Pfade dort als Argument eintrage, funktioniert nichts mehr.

    Das Programm selbst wandelt im Prinzip nur eine Cache-Datei in eine lesbare CSV-Datei um.
    Dazu wird einfach die Datei "dumber.exe" mit dem Parameter "--market" aufgerufen....danach der Speicherort der Cache-Datei und nach dem ">" dann den Ausgabeort als CSV-Datei.

    Befehl in Konsole via copy/paste (FUNKTIONIERT)
    "C:\Dokumente und Einstellungen\Administrator.TEST\Desktop\dumber.exe" --market "C:\Dokumente und Einstellungen\Administrator.TEST\Lokale Einstellungen\Anwendungsdaten\Testordner\1aa0.cache" > "C:\Dokumente und Einstellungen\Administrator.TEST\Desktop\Testordner\1aa0.csv"


    Befehl in C# via Argument (FUNKTIONIERT NICHT)
    p.StartInfo.Arguments = "/c \"C:\Dokumente und Einstellungen\Administrator.TEST\Desktop\dumber.exe\" --market \"C:\Dokumente und Einstellungen\Administrator.Test\Lokale Einstellungen\Anwendungsdaten\Testordner\1aa0.cache\" > \"C:\Dokumente und Einstellungen\Administrator.TEST\Desktop\Testordner\1aa0.csv\""


    ....im Debug-Modus in der Schnellansicht ergibt die C#-Zeile dann im Prinzip den Befehl, den ich nun einfach per Copy/Paste in die Konsole schmeißen könnte und er würde funktionieren.....aber die Konsole, die über C# gestartet wurde, führt ihn nicht aus.

    Jemand eine Idee?
  • in: C++ Anfängerfrage || Welche Library?

    geschrieben von adelwoehrer

    die Frage ist nur was du davon auch ausnützt.

    Die Antwort würde mir leichter fallen, wenn ich wüsste, was ich eigentlich alles brauche. :-)
    Ich habe konkret keine Spielidee, ich will mich nur mal mit der Umgebung vertraut machen.

    ....ich habe für DirectX ein hervorragendes Tutorial gefunden....gibts auch gute für OpenGL? (also von Grund auf angefangen?)
    Wenn Du Links hast, immer her damit....sonst google ich morgen mal. :-)
  • in: C++ Anfängerfrage || Welche Library?

    geschrieben von adelwoehrer

    Welche Engines?

    Naja, dachte da an das Unreal Development Kit.

    Wenn man dir einen Tipp geben darf: schau dir lieber statt DirectX die freie Alternative OpenGL an.

    Gibts es da Performance-Unterschiede?
    Wenn DirectX schneller rendert (oder wie man das nennt) ist es mir durchaus recht, zugunsten der Geschwindigkeit bei Windows zu bleiben und auf die Platformunabhängigkeit zu verzichten.
    Ich habe aber sowohl mit DirectX als auch mit OpenGL null Erfahrung....meist wird ja noch auf DirectX 9 gesetzt....aber 10 und 11 sind ja auch schon draußen, kann da OpenGL mithalten?

    ....also wie gesagt, kenne im Prinzip beides nicht, ist nur als allgemeine Frage zu verstehen. =)
  • in: C++ Anfängerfrage || Welche Library?

    geschrieben von adelwoehrer

    Und zu deinem Vorhaben mit dem Spiel: nimm Win32.

    Hab mich jetzt den Rest des Tages damit beschäftigt....sieht komplizierter aus, als es ist.
    Die ersten Dreiecke hüpfen schon am Bildschirm rum. :thumb:
    Jetzt muss ich noch dahinter kommen, wie das mit den Engines funktioniert....aber ich les mich erstmal weiter in DirectX ein.
  • in: C++ Anfängerfrage || Welche Library?

    geschrieben von adelwoehrer

    Ich bin derzeit dabei, von C# auf C++ umzusteigen, um mehr in den Bereich der Spieleprogrammierung einzutauchen.
    Dazu hab ich mir mal das DirectX SDK besorgt, mich ein bisschen in C++ belesen und ein paar Basisprogramme erstellt.
    Ich bin zuversichtlich, dass ich mit der Zeit schon in die ganze Sache hineinwachsen werde, mir stellt sich jetzt allerdings ein weiteres Problem, dass ich nicht ganz überblicke.
    Die Frage bezieht sich in der Hinsicht nicht auf ein geplantes Vorhaben, gleich mal ein neues Crysis aus dem Boden zu stampfen, aber rückblickend auf solche resourcenlastigen Spiele eben folgende Frage....

    Welche Library soll ich verwenden?

    Ich habe jetzt die Wahl zwischen CLR, MFC und Win32.
    CLR soll ja die größte mitgelieferte Funktionspalette samt Garbage Collection bieten, setzt aber .NET Framework vorraus.
    Das gute an MFC ist, dass man das .NET Framework nicht benötigt, Win32 hat dann kaum mehr Vorraussetzungen, bietet aber auch den geringsten mitgelieferten Funktionsumfang.
    Soweit habe ich mir jetzt mal den Unterschied dieser 3 aus Google zusammengestückelt.

    Was mich jetzt interessieren würde, ist nicht unbedingt die "einfachste" und "lesbarste" dieser Varianten zu nehmen, sondern die vergleichsweise performanteste.
    Ich mach mir unter anderem Gedanken darüber, ob die CLR vielleicht "überladen" mit Funktionen ist und das zu Geschwindigkeitseinbußen führt.

    Es wäre toll, wenn mir jemand den Unterschied zwischen den drei erklären kann....die Suchergebnisse zeigen nur die Vorteile der jeweiligen Librarys auf, kaum die Nachteile.
    Womit sollte ich beginnen?
    Gibt es grobe Unterschiede in der Auslegung der Sprache selbst (mal abgesehen von weniger Funktionen zu Win32 hin)?

    Ich stehe wirklich grad am Anfang....kann auch sein, das meine bisherige Interpretation totaler Blödsinn ist.
    Ich habe auch noch irgendwas vom managed und unmanaged Code gelesen....wo liegt da der Unterschied?
  • in: Bräuchte Vorschlag für korrekte SQLite-Select-Abfrage

    geschrieben von adelwoehrer

    Das glaub ich Dir schon, ich hab nur null Schimmer von Datumsfunktionen in SQLite, deshalb frag ich lieber zweimal. :biggrin:
    Problem sollte damit gelöst sein, vielen Dank.
  • in: Bräuchte Vorschlag für korrekte SQLite-Select-Abfrage

    geschrieben von adelwoehrer

    Und auf das JULIANDATE() solltest Du normalerweise nicht verzichten, da DATETIME() wieder einen String zurückliefert und JULIANDATE() daraus erst einen Float macht.


    Sicher, dass es (JULIANDAY(DATETIME('now')) ist?

    Laut Beschreibung liefert JULIANDAY ja die Anzahl der Tage zurück....berücksichtigt der Wert auch die Tageszeit, damit die Berechnung genau läuft?
    The julianday() function returns the Julian day - the number of days since noon in Greenwich on November 24, 4714 B.C.
  • in: Bräuchte Vorschlag für korrekte SQLite-Select-Abfrage

    geschrieben von adelwoehrer

    das hier sollte den Trick tun:


    Super, das klappt soweit, danke Dir.
    Ich hätte das nun aber gerne auf die Sekunde genau....ich denke, diese Abfrage prüft jetzt nur auf den Tag genau, oder?
    Denke ich hab schon die Lösung und das scheint auch zu funktionieren, könntest Du trotzdem mal schnell drüber schauen und mir sagen, ob das so passt?

    SELECT price FROM `reg_10000043` WHERE typeID = '22546' AND (DATETIME('now')  - DATETIME(issued,'+'||duration||' seconds') <= 0);
  • in: Bräuchte Vorschlag für korrekte SQLite-Select-Abfrage

    geschrieben von adelwoehrer

    Hui,
    ich habe mir deine Aufgabe jetzt zum 10. mal durchgelesen und werde jedes mal verwirrter.:confused:

    Ja, ich hol da immer etwas aus. :wink:

    Um auf den Punkt zu kommen, was ich eigentlich bräuchte....
    Ich habe einen DataReader, der alle Waren aus der Datenbank auslesen soll, deren Marktorder noch nicht abgelaufen ist.
    Damit das funktioniert, müsste ich aber den Wert der Tage, die direkt in der Tabelle in der Spalte "duration" stehen vom aktuellen Datum abziehen.
    Ich bräuchte also die Möglichkeit, den Duration-Wert der aktuellen Datensatzes der gerade vom Reader bearbeitet wird, vom aktuellen Datum abzuziehen....und hier blicke ich nicht ganz durch.

    Wie führe ich in einer SELECT Anweisung eine Berechnung mit einer Spalte innerhalb des Datensatzes aus, den der Reader gerade überprüft?
    Also laut dem Link den Du gepostet hast als Pseudocode zum Verständnis zum Beispiel: DATE_SUB('" + datum + "', [duration])
    Wie greife ich auf den Wert der Spalte "duration" zu, um damit zu berechnen, ob das aktuelle Datum abzüglich der Tage in der Spalte "duration" des aktuellen Datensatzes der gerade von der while-Schleife des DataReaders bearbeitet wird kleiner ist, als das Einstellungsdatum.

    ....es klingt noch immer zu kompliziert....ich kanns nicht einfacher erklären. :biggrin:

    Ich möchte den Wert einer Spalte zur Berechnung für die Gültigkeit der Expression in einer SELECT Abfrage verwenden.
    Soll heißen, ob der Datensatz gültig ist, soll erst berechnet werden, während der Reader liest.
  • in: Verbindung zu Datenbank herstellen

    geschrieben von adelwoehrer

    Ich hab doch gerade oben den Inhalt der Variablen gepostet...

    Das hab ich soweit schon gesehen, aber....

    In der ersten Spalte das Datum und die Zeit also z.B. 12.07.2012 15:55:22 und in den anderen 3 Spalten Text, z.B.: Test, Test, Das ist ein Test.

    Das wäre mal eine Beilspielseingabe..

    ....dachte dann, das sind nicht die Werte, die auch zur Exception führen, weil du ständig "Beispielseingabe" schreibst.

    Hmm....also wie gesagt, wenn ich mir Deinen Code einfach so kopiere und eine Query ausführe, klappt das ohne weiteres.
    Ist etwas von MySQL-Problemen am Server bekannt, die nur bestimmte Benutzer betreffen?
    Versuch mal, für Deine Spaltennamen keine Zahlen zu verwenden....ich hatte erst kürzlich ein ähnliches Problem....zwar mit einem anderen Datenbank-System, aber vielleicht bringt das ja was.
  • in: Bräuchte Vorschlag für korrekte SQLite-Select-Abfrage

    geschrieben von adelwoehrer

    Bräuchte mal kurz eure Hilfe für eine Datumskalkulation innerhalb einer SELECT-Abfrage.

    Folgendes Problem:

    Ich habe eine Tabelle namens reg_10000043.
    In dieser Tabelle befinden sich die Felder typeID, duration und issued.

    typeID ist ein Kenncode für eine Ware in einer Kauforder.
    duration ist die Anzahl der Tage, für die die Kauforder gültig ist.
    issued beinhaltet das Datum und die Zeit, in der die Kauforder erstellt wurde.

    Ich möchte nun alle Waren vom Typ "typeID" Abfragen, deren Einstellungsdatum (issued) größer ist, als das aktuelle Datum abzüglich der Tagesanzahl (duration).
    Soll heißen, ich möchte einfach alle noch aktiven Kauforders einer Ware abfragen....also jene, die laut Anzahl der Tage noch nicht abgelaufen sein sollten.

    Ich habe mich nun etwas in SQLite's Datumsfunktionen belesen, allerdings komme ich nicht ganz dahinter, wie das zu laufen hat.
    Meine aktueller Query sieht so aus:
    SELECT price FROM `reg_" + regionID + "` WHERE typeID = '" + typeID + "' AND issued > datetime('" + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + "', - duration);


    Mit eingesetzten Werten sieht der dann so aus:
    SELECT price FROM `reg_10000043` WHERE typeID = '22546' AND issued > datetime('2012-07-13 09:20:00', - duration);


    Ich prüfe also, ob das Einstellungsdatum (issued) noch größer ist, als das aktuelle Datum minus der Tagesanzahl (duration).
    Auf das Feld "duration" müsste ich immer direkt in der Datenbank, also direkt in der SELECT-Abfrage zugreifen....denke hier hab ich schon einen Fehler. (aber wie gehts richtig?)

    Die datetime() Funktion hab ich mir hier mal angesehen: http://www.sqlite.org/lang_datefunc.html
    Laut der Dokumentation, müsste der Befehl folgende Struktur haben: datetime(timestring, modifier, modifier, ...)
    Wobei der erste modifier die Anzahl der Tage angibt, die hinzugefügt werden sollen.
    Wenn ich also eine negative Zahl angebe, müsste die abgezogen werden.

    The time string can be followed by zero or more modifiers that alter date and/or time. Each modifier is a transformation that is applied to the time value to its left. Modifiers are applied from left to right; order is important. The available modifiers are as follows.

    1 NNN days
    2 NNN hours
    3 NNN minutes
    4 NNN.NNNN seconds
    5 NNN months
    6 NNN years
    7 start of month
    8 start of year
    9 start of day
    10 weekday N
    11 unixepoch
    12 localtime
    13 utc


    Nur hängt sich die Query nach der Ausführung sofort auf.
    Weiß jemand, wie man das richtig macht? =)
  • in: Verbindung zu Datenbank herstellen

    geschrieben von adelwoehrer

    Ja eben das was man vorher eingibt...

    Ja was wurde denn vorher eingegeben?
    Die Variablen müssen doch durch irgendeine Funktion befüllt werden.

    Es kann durchaus passieren, dass eine dieser Variablen Zeichen enthält, durch die die Ausführung der Query verhindert wird, weil nicht richtig escapte wurde....einfache Hochkommata oder Beistriche zum Beispiel.
    Bei verschiedenen SQL-Server Versionen hatte ich auch schon Probleme mit Datumsformaten.
    Solange kein vollständiger Datensatz von Dir gepostet wird, kann Dir niemand helfen....wenn ich nun einfach Werte in deine Query einfüge, funktioniert von meiner Seite her alles....ergo brauchen wir die Werte, die bei Dir in den Variablen stehen, wenn die Exception ausgelöst wird.
  • in: Verbindung zu Datenbank herstellen

    geschrieben von adelwoehrer

    Und das ist der Code:
    string myInsertQuery = "INSERT INTO table (1, 2, 3, 4) Values('" + eingabe1 + "', '" +eingabe2 + "', '" + eingabe3 + "', '" + eingabe4 "')";


    yorecords, wir brauchen die Werte, die in den Variablen "eingabe1", "eingabe2", "eingabe3" und "eingabe4" enthalten sind und mit denen dann schlussendlich die Query übergeben wird.
    Die Fehlermeldung allein ist einfach zu wenig, wir müssten Rätselraten.
    Kannst Du im Debug-Modus mal die Werte auslesen bevor die Exception ausgelöst wird und diese hier Angeben?
  • in: Gratis Obfuscator?

    geschrieben von adelwoehrer

    Jo, Socket mit OpenSSL und API....dann musst Du keine lokalen Login-Daten im Code speichern.
  • in: SQLite Befehl scheint einfach ignoriert zu werden

    geschrieben von adelwoehrer

    Ich habe die Datenbank nun neu erstellt und direkt mit dem SQLite Database Browser geöffnet.
    Ich habe für alle Spalten NULL-Werte erlaubt, und dann die Query direkt in der Datenbank ausgeführt.
    Als Rückgabewert, wenn ich die Query ausführe, erhalte ich "No Error" (also sollte passen)....aber die Tabelle bleibt leer....ich kapier's nicht. :-/

    Die Datenbank selber sagt mir, dass die Query passt....aber schafft es nicht mal selbst, sie auszuführen.


    EDIT:

    Problem gelöst!
    Es liegt tatsächlich daran, dass ausschließlich Zahlen für den Tabellennamen verwendet wurden.
    SQLite kann eine solche Tabelle anscheinend zwar erstellen, danach aber nicht damit arbeiten. -.-
    Wenn ich den Tabellennamen mit einem Buchstaben beginne, funktioniert alles wunderbar.
  • in: SQLite Befehl scheint einfach ignoriert zu werden

    geschrieben von adelwoehrer

    Den SQLite Befehl mit PHP zu senden hat funktioniert....er wurde ausgeführt und in der mit C# erstellten SQLite-Tabelle befindet sich jetzt der Datensatz.

    Hmmm....jetzt ist es zwar naheliegend zu sagen, es läge am .NET-Paket, aber alle anderen INSERT-Abfragen die ich soweit im Programmcode in C# habe, funktionieren tadellos.
    Wieso also nur diese eine nicht?

    Die genaue Query mit bereits eingesetzten Werten die ausgeführt werden soll lautet:
    INSERT INTO `10000043` (orderID, regionID, solarSystemID, stationID, typeID, volEntered, volRemaining, minVolume, range, jumps, duration, bid, price, issued) VALUES ('2561432957', '10000043', '30002187', '60008494', '207', '1347500', '1078673', '1', '32767', '0', '90', '0', '68.96', '2012-06-10 23:54:07');


    Diese Query soll eben einen Datensatz in die Tabelle "10000043" einfügen.
    Alle INSERT-Abfragen, die ich bisher auf andere Tabellen gemacht habe, haben funktioniert....nur INSERT-Abfragen auf DIESE Tabelle schlagen fehl.
    Bzw. schlagen nicht fehl....aber bleiben halt ohne Wirkung.

    Könnte es eventuell daran liegen, dass der Tabellenname nur aus Zahlen besteht?
    Aber PHP hatte ja auch keine Probleme damit.
  • in: HTML sprache

    geschrieben von adelwoehrer

    Da ist wohl jemand Guldengeil. -.-
    HTML Zeichenreferenz
  • in: SQLite Befehl scheint einfach ignoriert zu werden

    geschrieben von adelwoehrer

    Schau am besten mal in den Errorlog der Datenbank.

    Das ist ja das Problem....es wird kein Error-Log erstellt, weil es keinen Error gibt.
    Der Befehl wird einfach nicht ausgeführt....die Datenbank selbst gibt keinen Fehler zurück.
  • in: SQLite Befehl scheint einfach ignoriert zu werden

    geschrieben von adelwoehrer

    Hätte da ein Problem mit SQLite....ich komm einfach nicht dahinter, was da nicht stimmt.
    Ich erstelle eine neue Tabelle, sofern noch keine Tabelle mit diesem Namen existiert....das funktioniert.
    Danach möchte ich einfach einen Datensatz in diese Tabelle einfügen....er beendet den Befehl ohne Fehler, aber leider auch, ohne irgendwas gemacht zu haben.
    Die Tabelle ist nach Ausführung des INSERT INTO Kommandos immer noch leer.

    Hier mal mein Code:
    SQLiteConnection connection = new SQLiteConnection();
    
    connection.ConnectionString = "Data Source=F:\\bin\\Debug\\data\\market.db;Count Changes=off;Journal Mode=off;Pooling=true;Cache Size=10000;Page Size=4096;Synchronous=off;";
    connection.Open();
    
    SQLiteTransaction transaction = connection.BeginTransaction();
    SQLiteCommand command = new SQLiteCommand(connection);
    
    try
    {
    	command.CommandText = "CREATE TABLE IF NOT EXISTS `10000043` (orderID INTEGER NOT NULL PRIMARY KEY, regionID INTEGER NOT NULL, solarSystemID INTEGER NOT NULL, stationID INTEGER NOT NULL, typeID INTEGER NOT NULL, volEntered INTEGER NOT NULL, volRemaining INTEGER NOT NULL, minVolume INTEGER NOT NULL, range INTEGER NOT NULL, jumps INTEGER NOT NULL, duration INTEGER NOT NULL, bid INTEGER NOT NULL, price FLOAT NOT NULL, issued DATETIME NOT NULL);";
    	command.ExecuteNonQuery();
    
    
    	command.CommandText = "INSERT INTO `10000043` (orderID, regionID, solarSystemID, stationID, typeID, volEntered, volRemaining, minVolume, range, jumps, duration, bid, price, issued) VALUES ('2561432957', '10000043', '30002187', '60008494', '207', '1347500', '1078673', '1', '32767', '0', '90', '0', '68.96', '2012-06-10 23:54:07');";
    	command.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
    	MessageBox.Show("ex.Message");
    }
    
    command.Dispose();
    transaction.Commit();
    connection.Close();
    connection.Dispose();


    Erkennt jemand einen Fehler an der Query?
    Müsste doch eigentlich passen....Exception wird mir keine geliefert....der Befehl müsste also ausgeführt werden.
    Wenn ich im Nachhinein aber die Tabelle prüfe, wurde diese zwar erstellt, ist aber leer....
  • in: C# DownloadProgressChangedEventArgs || Falscher Status?

    geschrieben von adelwoehrer

    Hmm, das klingt logisch.
    Heißt konkret einfach, das Event wird zu oft ausgelöst, als dass die Konsole mit der Darstellung nachkommt.
    Deshalb werden einige Events in eine Warteschlange gereiht, die aber nicht der Reihe nach abgearbeitet wird.
    Heißt im Prinzip, es funktioniert alles, ich sollte nur den nicht jeden Byte ausgeben wollen. ^^

    Was die Thread-Übergreifenden Dinge angeht.
    Derzeit verwende ich da den Befehl "CheckForIllegalCrossThreadCalls = false;" direkt bei Programmstart.
    Das schaltet die Überprüfung ab....ist nicht Thread-Save, ich weiß, hatte aber nie Probleme damit. =)
    So ist es auch möglich, GUI Elemente aus einem anderen Thread heraus zu bearbeiten.
  • in: C# DownloadProgressChangedEventArgs || Falscher Status?

    geschrieben von adelwoehrer

    Das Problem besteht leider auch weiterhin.
    Rein aus Interesse....was würde [STAThread] normalerweise bewirken?

    Ich kann nicht so ganz nachvollziehen, woher das Problem rührt.
    Allmählich fange ich sogar an zu glauben, es handelt sich um ein Anzeigeproblem der Konsole.

    Wenn ich die Ergebnisse nämlich nicht in der Konsole ausgeben lasse, sondern in einer Textdatei logge, stimmt die Reihenfolge. o.O
  • in: C# DownloadProgressChangedEventArgs || Falscher Status?

    geschrieben von adelwoehrer

    Habe mir nur mal nebenbei eine kleine Consolenanwendung gebastelt, die den Downloadstatus wärend eines Downloads anzeigen soll.
    Die Ergebnisse sind aber etwas seltsam.

    Hier der Programmcode:
    static void Main(string[] args)
            {
                WebClient client = new WebClient();
                client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
                client.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(client_DownloadFileCompleted);
                client.DownloadFileAsync(new Uri("DateiZumDownloaden.zip"), "Dateipfad.zip");
            }
    
            private static void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
            {
                Console.WriteLine(e.BytesReceived.ToString() + " / " + e.TotalBytesToReceive.ToString() + " (" + e.ProgressPercentage.ToString() + " %)");
            }
    
            private static void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
            {
                Console.WriteLine("Done!");
            }



    Und das ist das Ergebnis (gekürzt):
    2141656 / 4355399 (49 %)
    2175236 / 4355399 (49 %)
    2188376 / 4355399 (50 %)
    2264296 / 4355399 (51 %)
    2351896 / 4355399 (53 %)
    2375256 / 4355399 (54 %)
    2426356 / 4355399 (55 %)
    2468696 / 4355399 (56 %)
    2522716 / 4355399 (57 %)
    2527096 / 4355399 (58 %)
    1147396 / 4355399 (26 %)
    1150316 / 4355399 (26 %)
    2561972 / 4355399 (58 %)
    2655412 / 4355399 (60 %)
    2696292 / 4355399 (61 %)
    2743012 / 4355399 (62 %)
    2785352 / 4355399 (63 %)
    2789732 / 4355399 (64 %)
    2842292 / 4355399 (65 %)
    1147396 / 4355399 (26 %)
    2915292 / 4355399 (66 %)
    2935732 / 4355399 (67 %)
    3040852 / 4355399 (69 %)
    3091872 / 4355399 (70 %)
    3122532 / 4355399 (71 %)
    3177848 / 4355399 (72 %)
    3196828 / 4355399 (73 %)
    1147396 / 4355399 (26 %)
    3199748 / 4355399 (73 %)
    2532936 / 4355399 (58 %)
    3215644 / 4355399 (73 %)
    3287020 / 4355399 (75 %)
    2535856 / 4355399 (58 %)
    3342336 / 4355399 (76 %)
    3407872 / 4355399 (78 %)
    3295780 / 4355399 (75 %)
    3523048 / 4355399 (80 %)
    3208508 / 4355399 (73 %)
    3546244 / 4355399 (81 %)
    1147396 / 4355399 (26 %)
    1147396 / 4355399 (26 %)
    3549164 / 4355399 (81 %)
    3552084 / 4355399 (81 %)
    3473408 / 4355399 (79 %)
    3560844 / 4355399 (81 %)
    3572524 / 4355399 (82 %)
    3556464 / 4355399 (81 %)
    3576904 / 4355399 (82 %)
    3584204 / 4355399 (82 %)
    3525968 / 4355399 (80 %)
    3588584 / 4355399 (82 %)
    3604480 / 4355399 (82 %)
    3587124 / 4355399 (82 %)
    3614700 / 4355399 (82 %)
    3619080 / 4355399 (83 %)
    3639520 / 4355399 (83 %)
    3642440 / 4355399 (83 %)
    3581284 / 4355399 (82 %)
    3657040 / 4355399 (83 %)
    3681696 / 4355399 (84 %)
    3735552 / 4355399 (85 %)
    3744312 / 4355399 (85 %)
    3747232 / 4355399 (86 %)
    3750152 / 4355399 (86 %)
    3753072 / 4355399 (86 %)
    3757452 / 4355399 (86 %)
    1147396 / 4355399 (26 %)
    3761832 / 4355399 (86 %)
    3764752 / 4355399 (86 %)
    3767672 / 4355399 (86 %)
    1147396 / 4355399 (26 %)
    1147396 / 4355399 (26 %)
    3770592 / 4355399 (86 %)
    3774972 / 4355399 (86 %)
    3801088 / 4355399 (87 %)
    3834668 / 4355399 (88 %)
    3652660 / 4355399 (83 %)
    3863868 / 4355399 (88 %)
    3948220 / 4355399 (90 %)
    1147396 / 4355399 (26 %)
    3958440 / 4355399 (90 %)
    3961360 / 4355399 (90 %)
    3997696 / 4355399 (91 %)
    4003536 / 4355399 (91 %)
    4077832 / 4355399 (93 %)
    3868084 / 4355399 (88 %)
    3610320 / 4355399 (82 %)
    4089512 / 4355399 (93 %)
    4092432 / 4355399 (93 %)
    4095352 / 4355399 (94 %)
    4143368 / 4355399 (95 %)
    4147748 / 4355399 (95 %)
    4194304 / 4355399 (96 %)
    4201604 / 4355399 (96 %)
    4226424 / 4355399 (97 %)
    4239564 / 4355399 (97 %)
    1147396 / 4355399 (26 %)
    4085132 / 4355399 (93 %)
    4259840 / 4355399 (97 %)
    4299260 / 4355399 (98 %)
    1147396 / 4355399 (26 %)
    1147396 / 4355399 (26 %)
    4305100 / 4355399 (98 %)
    4310940 / 4355399 (98 %)
    1147396 / 4355399 (26 %)
    4313860 / 4355399 (99 %)
    4355399 / 4355399 (100 %)
    4355399 / 4355399 (100 %)
    1147396 / 4355399 (26 %)
    4241024 / 4355399 (97 %)
    Done!
    4080752 / 4355399 (93 %)



    Weiß jemand, warum das Ergebnis der Ausgabe nicht geordnet von 0 bis 100 Prozent zählt und sogar noch nach Auslösen des DownloadFileCompleted Events eine Statusanzeige vom DownloadProgressChanged Event kommt?
    Das stimmt doch was nicht.
    Ich versuche das später auf eine progressBar zu übertragen, aber bei so einer Ausgabe würde die wohl nur sinnlos durch die Gegend hüpfen. o.O
  • in: C# Threading-Warteschleife

    geschrieben von adelwoehrer

    Funktioniert grandios. :thumb:
    Vielen Dank.
  • in: C# Threading-Warteschleife

    geschrieben von adelwoehrer

    Habe mir jetzt mal die Methoden zum Mutex angesehen, ich finde da aber nur Funktionen, um zu warten, bis die Ausführung eines Threads beendet ist, bevor mit dem nächsten begonnen wird.
    Die Reihenfolge muss ich demnach aber selbst bestimmen, bevor mit der Ausführung begonnen wird.
    Ich sehe da keine Möglichkeit, an den Mutex Threads zu übergeben, während dieser bereits abgearbeitet wird.

    Muss aber zugeben, dass ich noch keine Mutex benutzt habe und auch gar nicht weiß, was die genau machen sollen.
    Als Beschreibung steht nur, es wäre ein Synchronisierungstyp.
    Vielleicht kannst Du mir ein Code-Beispiel geben?


    Ich hätte inzwischen schon eine Möglichkeit gefunden, die funktionieren könnte.
    Dabei wird aber ein Array an Threads während der Ausführung der foreach-Schleife mit neuen Threads bestückt, was dann eine Exception auslöst.
    Die Exception fange ich ab, lösche alle Einträge bis zu dieser Exception, und starte die foreach-Schleife mit den verbleibenden (während der Ausführung hinzugefügten) Threads neu.
    Das ist aber eine unschöne Lösung, weil hier gezielt von einem Fehler ausgegangen werden muss.
  • in: C# Threading-Warteschleife

    geschrieben von adelwoehrer

    Ich google nun schon eine Weile nach einer Lösung für mein Problem, aber leider wird immer davon ausgegangen, dass man nicht ein und den selben Thread erneut aufruft, sondern mehrere parallel laufen.



    Folgende Ausgangssituation:

    Ich lasse für bestimmte Schreibvorgänge in eine Datenbank einen Thread erstellen, damit die GUI für den Benutzer nicht blockiert wird.
    Dieser Thread hat nun nichts weiter zu tun, als alle Datensätze (nicht unerhebliche Menge) in die Datenbank zu übertragen, was einige Zeit beansprucht.
    Während diesem Schreibvorgang ist die Datenbank-Datei schreibgeschützt und erlaubt keine weiteren Schreibvorgänge.

    Mein Problem ist nun aber, dass dieser Thread durch einen FileSystemWatcher gestartet wird, der bestimmte Ordner auf neu erstellte Dateien prüft.
    Werden diese Dateien zu schnell hintereinander erstellt, versucht das Programm einen neuen Thread zu starten, während der alte noch läuft.
    Durch den Schreibschutz auf die Datenbankdatei crasht nun natürlich das Programm.

    Da die asynchrone Ausführung hier durch den Schreibschutz nicht möglich ist, ich gleichzeitig aber auch keine Daten verlieren möchte, indem ich die Ausführung eines neuen Threads einfach ignoriere, während der alte noch läuft, müsste hier eine Warteschlange her, die ein und denselben Thread mit unterschiedlichen Dateien hintereinander abarbeitet.

    Ich bräuchte also eine Art Thread-Array, in das ich noch Threads anfügen kann, während es bereits abgearbeitet wird.

    Mein Pseudo-Code sieht derzeit in etwa so aus:
    Thread thread;
    
            FileSystemWatcherEvent()
            {
                thread = new Thread(schreibFunktion);
            }
    
            private void schreibFunktion()
            {
                // Schreibe Datei in Datenbank, die das Event ausgelöst hat
            }


    Ich hätte hierzu zwar schon was zu den Themen "Background Worker" und "Threadpool" gefunden, dort wird aber davon ausgegangen, dass man unterschiedliche Threads in die Warteschleifen hängt, um sie abzuarbeiten, nicht unterschiedliche Instanzen des selben Threads.

    Kann man ein und denselben Thread mehrmals hintereinander in eine Warteschlange hängen?
    Bzw. kann ich dieses Problem anders lösen?


    Also quasi:

    ThreadQueue queue = new ThreadQueue[3];
    
    queue[thread];
    queue[thread];
    queue[thread];
    
    oder ähnlich....



    Ich hoffe, es ist verständlich, was ich meine.
  • in: Daten als float speichern

    geschrieben von adelwoehrer

    Je nach Sprachzone und eingestellter Culture Info des PCs könnte die Datenbank auch auf die falschen Dezimaltrennzeichen prüfen.
    Dann macht es einen Unterschied, ob du "5,3" (Beistrich) oder "5.3" (Punkt) übergibst.

    Für gewöhnlich sollte das eine Fehlermeldung verursachen, vielleicht ergreift dein DB System hier aber auch Eigeninitiative und wandelt den unbekannten übergebenen Datentyp einfach automatisch in INT um....hatte ich immer wieder mal bei SQLite.

    Wäre eventuell auch gut zu wissen, welches Datenbanksystem Du benutzt.
    SQL, SQLite, MySQL?

    Poste doch zumindest den Sql-Kommando-String, den Du übergibst, wenn Du schon keine Code angeben willst.
  • in: PHPMyAdmin auf Benutzer beschränken

    geschrieben von adelwoehrer

    So oder so, irgendeine Lösung wird sich da schon finden lassen.
    Ich such noch ein bisschen weiter und geb dann Rückmeldung, was bei der Sache rausgekommen ist.
  • in: PHPMyAdmin auf Benutzer beschränken

    geschrieben von adelwoehrer

    Nene, das hast Du schon richtig verstanden.
    Ich hatte nur gehofft, PHPMyAdmin bietet diese Möglichkeit von sich aus, ohne sich selbst was zu basteln.
    Danke für die Hilfe. =)
  • in: C# Daten in MySql Datenbank schreiben

    geschrieben von adelwoehrer

    Sollte ein String, in dem Du Variablen verwendest, nicht so aussehen, sofern "ID" und "Name" Variablen sind?
    command.CommandText = "INSERT INTO test (ID, Name, Datum, Kategorie, Beschreibung) VALUES ('" + ID + "', '" + Name + "','24.04.2012','Musik','Beschreibungtest')";


    Das @ kenn ich eigentlich nur, um einen String richtig zu escapen.
    Wird zum Beispiel bei Pfadangaben verwendet.

    Dann muss man nicht "C:\\temp\\test" schreiben, sondern kann "@C:\temp\test" verwenden....ohne @ müsste man den Backslash mit einem weiteren Backslash escapen.
    Ich weiß nicht, ob MySQL das so annimmt.
  • in: PHPMyAdmin auf Benutzer beschränken

    geschrieben von adelwoehrer

    Also einfach ein zweites Login-System vor PHPMyAdmin schalten?
  • in: PHPMyAdmin auf Benutzer beschränken

    geschrieben von adelwoehrer

    Dann kann sich niemand mehr an die grafische Oberfläche anmelden, was allerdings für einige Benutzer möglich sein soll.
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Aber wird denn das jetzt nicht bereits genau so mit der Session gemacht?
    Ist doch nichts anderes, als eine ID zu vergeben, über die dann wärend der Gültigkeitsdauer alles läuft.
    Die Werte übergebe ich bereits via $_GET['Wert'] and die jeweilige Session ID und über OpenSSL.
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Mach einfach nen (Client-)Server der die MySQL Querys für den Client (In diesem falle dein Programm) ausführen soll und das Ergebnis an den Client schickt.

    Hä? :confused:
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Das ist in der Form leider nicht möglich.
    Mein Programm sammelt die Daten, die es übermitteln soll, vom PC.
    Es kann allerdings nicht alle Daten, die der Server zur sofortigen Berechnung bräuchte, auf einmal sammeln, da hierfür einige Bestätigungen des Benutzers erforderlich sind.
    Zusätzlich kommt hinzu, dass ich mangels Rechte am PC des Benutzers keine Schreibrechte habe (nichtmal im Programmordner selbst)....es ist mir also nicht möglich, die Daten erstmal zu sammeln und später gemeinsam abzuschicken, weil ich sie in der Zwischenzeit lokal nirgends abspeichern könnte.

    Das Program schickt also alle Daten, die es bekommt, umgehend an den Server....der Server seinerseits überprüft dann wiederrum, ob er vom Client PC bereits alle Daten hat, um dem Programm das berechnete Ergebnis zurückgeben zu können.
    Bis der Server alle Daten hat, kann es bis zu 15 Minuten dauern....deshalb liegen die Daten in der Zeit am Server....und da am besten halt in einer Datenbank.

    Ich habe natürlich auch Angeboten, die Daten erstmal im Programm als Array zu sammeln....ist vom Kunden aber nicht gewollt.
    Warum, weiß ich nicht....das lässt er sich nicht ausreden....ich muss nunmal programmieren, was der Kunde will.
    Von seiner Seite hieß es nur: "Möglichst sicher, und die Daten sofort übermitteln."
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Nagut, dann mach ich das so. =)
    Hätte nicht gedacht, dass man da nochmal auf eine "wirklich" sichere Lösung kommt, die sich nicht mit genug Aufwand aushebeln lässt.

    Danke an Alle für die Vorschläge.
    Problem sollte gelöst sein.
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Also endgültige Lösung: OpenSSL und Session?
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Und wie wäre theoretisch eine Lösung, die auf beiden Vorschlägen basiert?
    Also sowohl Session ID, als auch MAC Adresse?
    Noch eindeutiger könnte man einen PC doch beinahe schon nicht mehr identifizieren.

    Verschlüsselt wird dann noch zusätzlich nicht über MD5, sondern über SHA512, was 2 Strings mit je 128 Zeichen ergibt, die beide stimmen müssten.
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Klar, aber was passiert, wenn sich jemand die MAC einer anderen Person besorgt die auch dein Programm verwendet?

    Gut, das wäre dann der nächste Punkt....das wird zwar langsam etwas aufwendig für den Angreifer, aber Session IDs wären da wohl wirklich die bessere Lösung.

    Du machst bei der ersten Verbindung mit PHP eine Session auf, dort speicherst du dir irgendwas zu dem Client (was er z.B. aus der Datenbank abfragen darf).
    Später schickt der Client immer seine Session-ID mit, die er bei der 1. Anfrage erhalten hat; anhand dieser kann das PHP-Script dann entscheiden wer das ist und was er darf.

    Was mir hier noch durch den Kopf ginge....könnte man diese Session ID nicht abfangen, wenn sie vergeben wird? (Wireshark)
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Du brauchst dazu nicht einmal eine neue Netzwerkkarte einbauen... es reicht wenn du der Netzwerkkarte eine neue MAC-Adresse verpasst (was softwaremäßig funktioniert)... und das funktioniert in weit weniger als 15 Minuten

    Schon, aber das würde dann ja bewusst passieren. =)
    Wer sich durch solche Aktionen für 15 Minuten selbst aussperrt, ist dann auch selber Schuld.

    Was deine Idee mit der Session betrifft....warscheinlich habt Ihr durch frühere Fragen schon gemerkt, dass ich nicht unbedingt ein Händchen für Client--->Server Programmierung habe, deshalb frage ich mal ganz frech, wie denn das gehen müsste? =)

    dabei wird im Kommentar die Stringlänge von 32 vorgetäuscht und ansonsten wieder per

    OR 1 = 1

    die Sicherheit umgangen...

    Hast Recht, Kommentare hatte ich noch nicht bedacht, aber auch die lassen sich im Übergabewert abfangen.
    Erlaubt werden für den MD5 Hash ja nur Ziffern und Buchstaben, keine Slashes und Sonderzeichen.
    Das Script würde den Wert nicht als gültiges MD5 ansehen.

    Eine zusätzliche OR-Anweisung sollte bei einem escapeten String eigentlich fehlschlagen, wenn sie zusammen mit dem Wert übergeben wird, liege ich da richtig?
    Ausserdem besteht auch hier wieder das Problem für den Angreifer, das zusammen mit der OR-Anweisung ein "=" mitgeliefert wird, was für einen ungültigen MD5 Wert sorgt.

    Mir ist zwar schleierhaft, warum der TS eine DB braucht, um Daten nur für 15 Minuten zu persistieren, aber egal.

    Naja, was sonst?
  • in: Kann mir jemand einen guten Laptop nenne WICHTIG !

    geschrieben von adelwoehrer

    Ja, ich denke ich kenne da Jemanden.
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    "WHERE 1=1" und du hast wieder das Problem mit dem unbeschränkten SELECT.

    Die WHERE Klausel befindet sich bereits im Script.
    Sie lautet "WHERE hash = "....übergeben wird nur der Wert hinter dem "=", und der wird auf die Länge geprüft.
    Jeder MD5 Hash hat eine gewisse Zeichenzahl....damit sollte das funktionieren.

    Solange sollte eine IP Adresse dann doch erhalten bleiben.

    Jo, hab dann gesehen, dass Du im Prinzip genau das selbe meintest, nur eben mit der IP.
    Trotzdem wäre die MAC Adresse etwas statischer....es ist noch immer warscheinlicher, dass sich die IP ändert, als das innerhalb von 15 Minuten eine neue Netzwerkkarte eingebaut wird.

    Allerdings kennt der Angreifer seine Mac Adresse und kann die md5 verschlüsseln. Wenn er die an das Php sendet, hat er Zugriff.

    Und was fängt ein Angreifer mit seiner eigenen MAC Adresse an?
    Er kann dann ja nur auf seine eigenen Datensätze zugreifen.
  • in: PHPMyAdmin auf Benutzer beschränken

    geschrieben von adelwoehrer

    Ich habe auf meinem Server neben einer MySQL Datenbank auch PHPMyAdmin installiert.
    Normalerweise bin ich ja generell gegen GUIs bei Datenbanken, aber da ich derzeit für ein C# Projekt programmiere, deren Projekt-Mitarbeiter die Datenbank verwalten können müssen, ohne sich mit Querys auszukennen, bleibt mir da keine andere Möglichkeit.

    Jetzt gibt es auf dieser MySQL Datenbank 2 Arten von Benutzeraccounts.
    Zum einen die normalen Benutzer, die die Datenbank verwalten können sollen....und zum Anderen die auf Minimal-Rechte beschränkten Benutzer, die zum Ausführen der Abfragen für das Programm benutzt werden.
    Letztere sind so zugeschnitten, dass sie meist nur SELECT Abfragen auf eine einzige Tabelle ausführen können und dann auch nur, wenn es eine gezielte WHERE Klausel auf einen Primärschlüssel eines Datensatzes gibt.
    Sie können also nicht mit einer Query alle Datensätze der Tabelle anzeigen lassen.


    Mein Problem mit PHPMyAdmin ist nun, dass sich nicht nur die Verwaltungsbenutzer über die grafische Oberfläche anmelden können, sondern auch die für das Programm festgelegten Benutzer, die rein nur dazu gedacht sind, Querys auszuführen.
    Meldet sich ein solcher Programm-Benutzer nun über PHPMyAdmin an, hat der zwar keine Rechte, irgendetwas zu machen, aber es werden ihm dennoch alle Datensätze in der Tabelle angezeigt und eben grafisch dargestellt, was ich möglichst vermeiden möchte.


    Meine Frage also.
    Wie kann ich den Login über PHPMyAdmin sperren, obwohl der Benutzer selbst ein gültiger Account ist, der sich am Server einloggen und Abfragen ausführen kann?
    Ich möchte also quasi das Anmelden an die grafische Oberfläche für bestimmte Benutzer deaktivieren, obwohl ihre Accounts funktionsfähig bleiben sollen.
    Ich habe in der Doku nur so viel gefunden, dass sich die Anmeldung an PHPMyAdmin auf bestimmte IPAdressen beschränken lässt, aber nicht auf bestimmte Benutzer.

    Der Login von PHPMyAdmin soll also erscheinen, aber den Login für bestimmte Benutzer sperren, obwohl der Account gültig ist.

    Ist es möglich, das irgendwie zu bewerkstelligen?
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Ich verstehe jetzt nicht ganz, wieso ich die IP Adresse überprüfen soll.
    Worauf denn?
    Und welche?
    Die sind doch dynamisch und nach einem Router-Neustart wieder geändert.
    Wie entscheide ich, dass eine IP Adresse ungültig ist?
    Das Programm darf doch von jedem Rechner prinzipiell gestartet werden.

    Die IP Adresse sagt mir doch nur, dass die Anfrage von einem bestimmten Rechner kommt....nicht dass diese Anfrage auch von meinem Programm stammte.


    EDIT:

    Dein Vorschlag mit der IP Adresse hat mich auf eine Idee gebracht.

    Ich wüsste aber gerne, ob ihr denkt, dass das funktioniert.
    Vielleicht hab ich ja was übersehen.

    Ich leite die Anfrage, die die Daten an den Server überträgt nicht direkt an den Server, sondern an ein PHP Script.
    Das Script erstellt dann die Daten in der Datenbank mit einem Passwort, dass eben direkt am Server hinterlegt ist....das sollte das Problem mit dem Passwort auslesen beseitigen.
    Als zusätzliches Identifikationsfeld für die Datensätze frage ich dann aber noch die MAC Adresse der Netzwerkkarte des PCs ab, von dem die Daten übermittelt wurden und speichere Ihren MD5 Hash zusätzlich zu jedem Datensatz ab.
    Damit sind die Datensätze eindeutig einem PC zugeordnet.

    Dieses PHP Script akzeptiert im nächsten Schritt nur dann SELECT Anfragen, wenn diese eine WHERE Klausel in der Abfrage aufweisen, womit es nicht möglich ist, alle Daten einer Tabelle zu erwischen, sondern nur gezielte Anfragen zu starten.
    Als Parameter für diese WHERE Klausel, wird wiederum die in MD5 Hash umgewandelte MAC Adresse der Netzwerkkarte übergeben.
    Startet man nun eine SELECT Anfragen, beschränke sich diese auf die Netzwerkkarte mit dem MD5 Hash der hinterlegten MAC Adresse, solange sich die Daten am Server befinden.
    Theoretisch sollte es so unmöglich sein, von einem anderen PC aus diese Daten abzurufen, außer von dem, von dem sie auch erstellt wurden.
    Um hier das PHP Script auszutricksen, wäre es schon nötig, den MD5 Hash der Netzwerkkarte zu kennen, die die Datensätze erstellt hat.


    Wäre das eurer Meinung nach eine mögliche Lösung?
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Benutzeraccounts sollen vermieden werden....eine Anmeldung soll zum Verwenden des Programmes nicht nötig sein.
    Der Benutzer trägt durch das Programm keine Daten selbstständig auf dem Server ein.
    Ich werde ihm diese Möglichkeit durch den Client auch gar nicht geben.
    Das Programm sucht sich die Daten selbst vom PC und überträgt diese....es geht wirklich einzig und allein darum, zu verhindern, dass ein Dritter mithilfe der Zugangsdaten des MySQL Servers an diese Daten rankommt.

    Ich bin root auf dem Server, ja.
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Ein DROP TABLES geht dann (wenn du sauber programmiert hast) nicht mehr.

    Ein DROP TABLES wäre hier eigentlich egal, da die Daten nur temporär für die Zeit ihrer Verarbeitung gespeichert und dann wieder gelöscht werden.
    Ein Datensatz liegt also ca. 15 Minuten am Server.
    Datenverlust würde ich besser verkraften, als das Auslesen dieser Daten von Dritten.
    SELECT Anfragen dürfen daher nur an das Programm weitergeleitet werden und sind mein Hauptproblem.
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Die Datenbank liegt online, ja.
    Das Programm läuft lokal und soll Daten in diese Online-Datenbank eintragen.
    Die Zugangsdaten, die das Programm dazu verwendet, sollen aber nicht auszulesen sein, darum gehts ganz grob.
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Du darfst dann die Anwendung und das Passwort natürlich auch nur an vertrauenswürdige Personen geben.

    Würde ich das Programm nur an vertrauenswürdige Personen weitergeben wollen, hätte ich jetzt dieses Problem nicht, oder? o.O
    Das Programm wird veröffentlicht.
  • in: MySQL Passwort vor Dritten schützen?

    geschrieben von adelwoehrer

    Da ich derzeit an einer C# Anwendung programmiere, die unter anderem auch eine Verbindung zu einer MySQL Datenbank bereitstellt, stellt sich mir nun das Problem, dass ich nicht weiß, wie ich das Passwort für diese Verbindung am besten hinterlegen soll.
    Es gibt ja genug Decryptoren, die den Bytecode in Quellcode zurück kompilieren und hier stoße ich halt bei jeder Methode, die mir so durch den Kopf geht, auf diverse Probleme.
    Ich habe nun mehr oder minder sinnvolle Vorschläge in einigen Foren erhalten....also stelle ich die Frage auch nochmal hier.
    Ich weiß natürlich, dass es keine vollkommen sichere Methode gibt, das Passwort vor geübten Reverse Engineerern zu schützen....ich suchen nur die kreativste Möglichkeit, es ihnen so schwer wie möglich zu machen.
    Dabei reicht es mir schon, wenn sich nur der Aufwand nich lohnt.


    Folgende Lösungsvorschläge wurden mir bereits gemacht:

    - Hinterleg das Passwort in einer Textdatei.
    Jupiiieeeee. \o/

    - Hinterleg das Passwort im Quellcode, den bekommt nie einer entschlüsselt.
    .... -.-

    - Hinterleg das Passwort als MD5 Hash im Quellcode.
    Toll, und was hindert einen daran, dann einfach den MD5 Hash als Passwort an den Server zu schicken?
    Der nächste Vorschlag war dann, nicht den MD5 Hash zu schicken, sondern ihn vor dem schicken wieder zu entschlüsseln....das wurde dann so dementiert, dass man einen MD5 Hash nicht entschlüsseln kann und diese Methode daher absolut sicher ist....ihr erkennt die Ironie?

    - Hinterleg das Passwort in der App.config Datei.
    Dann schaut man eben im Quellcode nach, von wo das Programm das Passwort bezieht....und guckt dann eben in die App.config.

    - Hinterleg das Passwort in der App.config verschlüsselt, und entschlüssle es erst im Programm.
    Was hindert einen daran, die Methode, mit der entschlüsselt wird, aus dem Quellcode auszulesen und einfach auch auf das Passwort anzuwenden?

    - Leite die Anfrage nicht direkt an den Server, sondern schreibe ein PHP Script, dass Dein Passwort mit einer dem Angreifer unbekannten Verschlüsselung an den Server weiterleitet.
    Und was hindert einen Angreifer daran, einfach das selbe Script aufzurufen?
    Er muss die Art der Verschlüsselung doch nicht kennen, wenn die Entschlüsselung eh das Script übernimmt.

    - Ändere das Passwort und die Verschlüsselung am Server alle 60 Sekunden und schreib ein Script, dass dann dem Programm mitteilt, welche Verschlüsselung und welches Passwort gerade verwendet wird.
    Selbes Problem....was hindert Jemanden daran, einfach das selbe Script auszuführen und sich vom Server das Passwort und die Verschlüsselungsart geben zu lassen?


    Wie ihr seht, stecke ich da ziemlich in der Klemme.
    Ich bin mit meinem Latein am Ende und es kommen auch keine Vorschläge, zu denen ich nicht sofort ein Dementi einzuwenden hätte.
    Musste sich schon einer von Euch mit diesem Problem beschäftigen?
    Irgendwelche "Best Case" Lösungen?
  • in: SQLite Query Exception (weil negativer Integer)

    geschrieben von adelwoehrer

    Die Variablen sind bereits strings.


    EDIT:
    Offenbar hat es an der DLL für SQLite gelegen.
    Ich habe am Code nichts geändert und einfach mal die aktuelle Version der DLL runtergeladen, und siehe da, es funktioniert.
    Was an der alten aber plötzlich Fehler verursacht, versteh ich nicht....meine anderen Programme laufen auch noch alle gut damit.

    Problem also gelöst, auch wenn ich nicht weiß wie. =)
    Danke für die Lösungsvorschläge.
  • in: SQLite Query Exception (weil negativer Integer)

    geschrieben von adelwoehrer

    Ist doch alles abgeschlossen?
    Sonst würde er mich nichtmal kompilieren lassen.

    Tut mir leid, aber ohne Anführungszeichen funktioniert kein einziges Kommando.
    Es klappt ja so lange, bis ein negativer Wert eingefügt werden soll....am Aufbau des Strings sollte es also nicht liegen.
  • in: SQLite Query Exception (weil negativer Integer)

    geschrieben von adelwoehrer

    Guten Abend,

    habe da ein seltsames Problem.
    Ich verwende eine SQLite Datenbank über C#, um Datensätze zu speichern.

    Probleme bereitet mir jetzt folgende Query:

    INSERT INTO `assetList` (itemID, locationID, typeID, quantity, flag, singleton, rawQuantity) VALUES ('" + itemID + "', '" + locationID + "', '" + typeID + "', '" + quantity + "', '" + flag + "', '" + singleton + "', '" + rawQuantity + "');


    Alle Spalten sind Integer.
    Die Spalte "rawQuantity" enthält unter anderem auch negative Werte.

    So kann eine mögliche Query z. B. so aussehen:

    INSERT INTO `assetList` (itemID, locationID, typeID, quantity, flag, singleton, rawQuantity) VALUES ('12345678', '1234', '5678', '100', '5', '1', '-1');


    Versuche ich nun, diese Query per C# zu senden, erhalte ich eine Exception wegen einem Null-Verweis.
    Lasse ich die selbe Abfrage hingegen direkt in der Datenbank laufen, ist sie erfolgreich.

    Abfragen ohne negative Werte funktionieren hingegen auch über C#.


    Der komplette Code wäre:
    SQLiteConnection connection = new SQLiteConnection();
    
    connection.ConnectionString = "Data Source=" + database_main_path + characterID + ".db;Count Changes=off;Journal Mode=off;Pooling=true;Cache Size=10000;Page Size=4096;Synchronous=off;";
    
    connection.Open();
    
    SQLiteTransaction transaction = connection.BeginTransaction();
    
    SQLiteCommand command = new SQLiteCommand(connection);
    command.CommandText = "INSERT INTO `assetList` (itemID, locationID, typeID, quantity, flag, singleton, rawQuantity) VALUES ('" + itemID + "', '" + locationID + "', '" + typeID + "', '" + quantity + "', '" + flag + "', '" + singleton + "', '" + rawQuantity + "');";
    
    command.ExecuteNonQuery();
    
    command.Dispose();
    transaction.Commit();
    connection.Close();
    connection.Dispose();


    Ich weiß nicht, warum C# mir eine Exception liefert, obwohl die Query funktioniert, wenn ich sie per Copy&Paste direkt in die Datenbank kopiere.
    Jemand eine Idee?
  • in: Portabler Webserver (ohne MySQL)

    geschrieben von adelwoehrer

    Gut, würd ich auch sagen.
    Ich denke, man kann es dann wohl nicht allen Recht machen.

    Dann mal wieder danke für Deine Hilfe. =)
    Problem gelöst.
  • in: Portabler Webserver (ohne MySQL)

    geschrieben von adelwoehrer

    Das hat geklappt. =)
    Naja....halt wieder ein neues Problem.

    Die beiden Server laufen jetzt parallel nebeneinander und stören sich soweit nicht.
    Wenn ich allerdings bei einem von beiden die "stop_apache.exe" ausführe oder Apache über das Control Panel beende, schließen sich beide Server.

    Ich weiß nicht, ob es da ein Work-Arround gibt.
  • in: Was haltet ihr vom "Schultrojaner"?

    geschrieben von adelwoehrer

    Hast du meinen Beitrag nicht komplett gelesen? Der Einsatz des Programmes wurde fallen lassen

    Türlich hab ich deinen Beitrag gelesen, ich bin nur trotzdem so pingelig, über die Definition zu streiten. =)
    Vergiss es einfach, Thema ist eh erledigt.


    jetzt müssen die Schulleiter die Schulserver auf illegales sichten. Nennst du diese auch Trojaner?

    Reiß mal nichts aus dem Konzept, mir ist klar, was ein Trojaner ist. -.-
  • in: Portabler Webserver (ohne MySQL)

    geschrieben von adelwoehrer

    Ufff....ich scheine zu blöd für die Config-Dateien zu sein. :-/

    Es gibt zwar eine Liste von Befehlen die ich mal schnell über Google gefunden hab, unter denen auch der Befehl zum dauerhaften Deaktivieren von SSL zu finden ist, die sind allerdings für Debian gedacht.
    Wenn ich hingegen versuche, die "setup_xampp.bat" auszuführen, lässt sich auch dort Nichts einstellen....der sagt mir einfach "Nothing to do, closing now....".
    Ich habe natürlich vorher versucht, in der Konfigurationsdatei für SSL das "Listen Port" auszukommentieren....den Port versucht er trotzdem zu belegen.
    Habe auch versucht, statt 443 einen anderen Port anzugeben, dann bleibt Apache wärend dem Laden hängen.
    Selbes Ergebnis, wenn ich versuche die Modul-Imports auszukommentieren oder den "Include-Tag" entferne.
  • in: Was haltet ihr vom "Schultrojaner"?

    geschrieben von adelwoehrer

    autobert schrieb:

    aber ohne Wissen des Anwenders eine andere Funktion erfüllt.
    http://de.wikipedia.org/wiki/Trojanisches_Pferd_%28Computerprogramm%29


    Ist es denn jetzt so wichtig, ob man weiß, dass das Program genau das macht, was es auch machen würde, wenn man es nicht wüsste?
    Dann trägt es eben nicht den Titel "Trojaner" und erfüllt halt trotzdem die gleiche Funktion.
  • in: Portabler Webserver (ohne MySQL)

    geschrieben von adelwoehrer

    Natürlich kannst du das Problem umgehen indem du deinen XAMPP auf einem anderen Port laufen lässt, beispielsweise 8080 oder 8888, der Benutzer muss dann aber auch http://localhost:8080/ bzw http://localhost:8888/ schreiben.

    Das ist sogar wünschenswert und wäre kein Problem.

    Ich habe das ganze jetzt mal getestet.
    Also, XAMPP installiert....eine einfache Standart-USB-Installation mit Standart-Port 80 und MySQL, wie sie normalerweise laufen würde.
    Habe aber vorher noch den XAMPP-Ordner kopiert, und im kopierten Ordner den Port auf 8888 geändert.

    Ich habe daraufhin die Standart-Installation über das Control-Panel gestartet....sowohl Apache als auch MySQL.
    Danach habe ich versucht, aus dem kopierten Ordner heraus, wo der Port in der Konfiguration von Apache auf 8888 geändert wurde, die start_apache.exe auszuführen.

    Beim starten der start_apache.exe erhalte ich aber folgenden Fehler:
    Diese Eingabeforderung nicht waehrend des Running beenden
    Bitte erst bei einem gewollten Shutdown schliessen
    Please close this command only for Shutdown
    Apache 2 is starting ...
    (OS 10048)Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder
     Anschluss) nur jeweils einmal verwendet werden.  : make_sock: could not bind to
     address [::]:443
    (OS 10048)Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder
     Anschluss) nur jeweils einmal verwendet werden.  : make_sock: could not bind to
     address 0.0.0.0:443
    no listening sockets available, shutting down
    Unable to open logs
    
    Apache konnte nicht gestartet werden
    Apache could not be started
    Drücken Sie eine beliebige Taste . . .


    Port 443 ist doch MySQL, oder?
    Ich habe nur die start_apache.exe ausgeführt....wieso versucht er MySQL ein zweites mal zu starten?
    Da hat er jetzt natürlich einen Konflikt mit den Ports, weil dieser bereits belegt ist.
  • in: Portabler Webserver (ohne MySQL)

    geschrieben von adelwoehrer

    Einfach die Funktionen, die ich nicht brauche, löschen?
    Stimmt eigentlich, XAMPP ist da ja ziemlich modular aufgebaut.
    Mal schauen, ich geb gleich Rückmeldung. =)



    EDIT:
    Ich sehe da vielleicht ein weiteres Problem, dass aber damit jetzt nichts zu tun hat.
    Wie wird sich XAMPP verhalten, wenn der Anwender meiner Software seinerseits bereits ein XAMPP für seine eigenen Zwecke installiert und laufen hat?
    Werden die beiden XAMPPs auf unterschiedlichen Ports parallel laufen, oder wird nur einer der beiden ausgeführt?
    Erhalte ich dann quasi eine Meldung ala "XAMPP läuft bereits"?
  • in: Portabler Webserver (ohne MySQL)

    geschrieben von adelwoehrer

    Ich programmiere gerade eine Anwendung in C#, mit der auch ein portabler Webserver mitgeliefert werden soll.
    Da ich für das Programm eine SQLite-Datenbank benutze und der Webserver nur PHP und Javascript bewerkstelligen soll, ist eine MySQL-Datenbank die noch zusätzlich im Hintergrund läuft, ein unschöner Nebeneffekt.

    Ich habe für "XAMPP" kein Paket gefunden, dass auch ohne MySQL-Server auskommt.
    Habe auch "Mowes Portable" getestet....hier kann man zwar im Paket-Manager den MySQL-Server abwählen, danach funktioniert der Dienst aber nichtmehr, weshalb ich mich frage, wozu diese Möglichkeit gut sein soll. :-)
    Ich habe dann auch noch den "Uniform Server" versucht....der tut zwar, was er soll, und kommt mit Apache und PHP aus, allerdings scheinen die "Start" und "Stop" Scripts für den Server nach deren Ausführung einfach als Zombie-Prozesse weiter zu laufen. (unschön)

    Ich suche also einfach einen möglichst schlanken, portablen (keine Installation) Webserver, der mir Apache, PHP und Javascript bietet und ohne MySQL geliefert wird.
    Hätte jemand eine elegante Lösung hierfür?


    Beste Grüße
  • in: Was haltet ihr vom "Schultrojaner"?

    geschrieben von adelwoehrer

    weil man ja nicht sicher gehen kann ob wirklich nur der staat die benutzt oder auch andere leute

    Nur der Staat?
    Ist das nicht schon genug?

    Man klatscht jemandem nen Virus auf den Rechner und nennt das ganze dann Datenschutz.
    Was sich die Regierung so erlaubt, ist doch wirklich schon absurd....Piraten-Partei ich komme. -.-

    Ein Trojaner um Daten zu "schützen".
    Und da es hier um Schulen geht, wird man hier vor illegaler Bildung geschützt?

    Das ganze nennen wir dann "Raub-Lernen" und schreiben hohe Strafen darauf aus.
    Und schon hat der Staat wieder ein Thema, dass er vor wichtigere Dinge schieben kann.
  • in: PHP || Wert eines Attributes einer XML-Datei auslesen

    geschrieben von adelwoehrer

    Deaktiviert habe ich nichts.
    Da läuft einfach eine frische XAMPP Installation um das Script irgendwie testen zu können.
  • in: PHP || Wert eines Attributes einer XML-Datei auslesen

    geschrieben von adelwoehrer

    Und funktioniert natürlich wie eine Eins. =)
    Ich habe Ewigkeiten danach gegoogelt, danke.

    Am Aufbau des XML-Dokumentes selbst kann ich leider nichts ändern, das ist eine API die ich von der Seite des Entwicklers beziehe.
    Aber es scheint trotz Fehler alles zu klappen.
  • in: PHP || Wert eines Attributes einer XML-Datei auslesen

    geschrieben von adelwoehrer

    Habe ein Problem dabei, den Wert eines Attributes einer XML-Datei über PHP auszulesen.
    Ich bekomme einfach keinen Wert zurück.

    Generell geht es darum, jede "row" auf vorhandensein des Attributes "rawQuantity" zu überprüfen.
    Ist das Attribut vorhanden, soll einfach sein Wert ausgegeben werden.

    Die XML-Datei ist folgendermaßen aufgebaut:
    <eveapi version="2">
        <currentTime>2012-04-20 15:36:02</currentTime>
            <result>
                <rowset name="assets" key="itemID" columns="itemID,locationID,typeID,quantity,flag,singleton">
                    <row itemID="206888503" locationID="60007168" typeID="1819" quantity="1" flag="4" singleton="0"/>
                    <row itemID="1252706043" locationID="60007168" typeID="967" quantity="1" flag="4" singleton="1" rawQuantity="-1"/>
                    <row itemID="1413217407" locationID="60007168" typeID="1318" quantity="1" flag="4" singleton="1" rawQuantity="-1"/>
                    <row itemID="1001594515266" locationID="60007168" typeID="11082" quantity="1" flag="4" singleton="0"/>
                    <row itemID="1001594519031" locationID="60007168" typeID="12207" quantity="1" flag="4" singleton="0"/>
                    <row itemID="1005669663551" locationID="60007168" typeID="587" quantity="1" flag="4" singleton="1" rawQuantity="-1">
                    <row itemID="1005697415058" locationID="60007168" typeID="22555" quantity="1" flag="4" singleton="1" rawQuantity="-1"/>
                    <row itemID="1005830297705" locationID="60007168" typeID="11488" quantity="1" flag="4" singleton="1" rawQuantity="-1">
                </rowset>
            </result>
        <cachedUntil>2012-04-20 20:22:18</cachedUntil>
    </eveapi>



    Und mein Code dazu sieht so aus:
    $xml = simplexml_load_file(xml-datei);
    
    foreach ($xml->result->rowset->row as $row)
    {
        if (isset($row[0]->rawQuantity) == true)
        {
            echo $row[0]->rawQuantity;
        }
    }


    Ich nehme an, bei "rawQuantity" fehlt noch etwas....kann mir jemand auf die Sprünge helfen bitte? =)
  • in: PHP || XML-Datei mit variabler Anzahl an Child-Nodes parsen

    geschrieben von adelwoehrer

    Die Logik dahinter ist mir soweit klar.
    Ich weiß nur nicht, wie das im Code dann aussehen soll.
    Hast Du ein Beispiel?


    EDIT:

    Gedankenblitz. -.-
    Hätte mir eigentlich gleich in den Sinn kommen können, das ganze in einer Funktion zu verpacken.
    Danke für den Denkanstoß.
  • in: Wie teuer kostet EVE Online pro Monat?

    geschrieben von adelwoehrer

    Du findest die Homepage von EVE Online nicht?
    Da bist Du ja der richtige EVE Spieler.

    Man nennt das Spiel nicht umsonst "die schönste Excell-Tabelle der Welt". =)
    Ich geb dir ne Woche....
  • in: PHP || XML-Datei mit variabler Anzahl an Child-Nodes parsen

    geschrieben von adelwoehrer

    Ich habe eine XML-Datei, deren Nodes, sowie alle Child-Nodes dieser Nodes und die Child-Nodes der Child-Nodes (usw.) in eine MySQL-Datenbank importiert werden sollen.
    Nun haben die Nodes aber eine unterschiedliche Anzahl von Child Nodes, und ich komme einfach nicht dahinter, wie ich das in einer Schleife sinnvoll durchlaufen kann.

    Mein Code sieht derzeit ungefähr so aus.
    foreach ($xml->children() as $second_gen)
    {
        In MySQL eintragen....
    
        foreach ($second_gen->children() as $third_gen)
        {
            In MySQL eintragen....
    
            foreach ($third_gen->children() as $fourth_gen)
            {
                In MySQL eintragen....
            }
        }
    }


    Wie ihr seht, frage ich jede Child-Node nach weiteren Child-Nodes ab, ohne zu wissen, ob sie überhaupt Child-Nodes haben.
    Ich kann das jetzt natürlich bis zu 20 Child-Nodes verschachteln, dann wird sicher keine ausgelassen....das halte ich aber nicht für eine sehr elegante Lösung.

    Ich müsste also irgendwie prüfen, ob eine Child-Node vorhanden ist.
    Das allein wäre nicht so das Problem....aber wie lege ich fest, dass die Schleife dann eine Ebene tiefer geht? (Also zur untergeordneten Child-Node?)
  • in: Gebannt in Online Spielen Rechtmäßig?

    geschrieben von adelwoehrer

    "Fucking Heuling N00B Lima ist kein Forum um sich über spieleverbannungen auszuheulen geht anderen leuten damit auf die Nerven nicht uns". Du regst dich über mein scheinbar andauerndes Geflame in Online-Spielen auf, was du ja auch so gut beurteilen kannst nach einem Post und lässt dann so einen Post los?

    Ach fühlst du dich beleidigt und beschimpft wegen deiner Heulerei hier im Lima-Forum? Ich krieg jetzt so richtig Angst Ohne Grund gebannt zu werden :wave:


    Jau, und dann startet kalina ein neues Thema, ob dieser grundlose Bann denn eigentlich rechtens war, denn immerhin gehört ja der böse Troller gebannt, der ihn dazu bewogen hat und nicht der Flamer. :wink: (Achtung Ironie)
    Und schon bist Du der Böse, midwar.


    Und ausserdem....
    Dann zum Thema "Fucking Noob" und "Stop that retarded dumb". Wenn ihr euch auskennen würdet, dann würdet ihr merken, dass Noob bei nicht nur Gelegenheitsspielern sondern Dauerspielern keine wirkliche Beleidigung ist. "Noob" ist eine Feststellung, nämlich dass der andere ein Anfänger ist - oder zumindest ein schlechter Spieler.

    Deine Worte....du wurdest lediglich als Anfänger bezeichnet....ist doch nichts dabei, oder?
    Kalina ist ein Top 20 "Spieler" bei Lima. :wink:
  • in: Gebannt in Online Spielen Rechtmäßig?

    geschrieben von adelwoehrer

    Es geht mir nicht darum, OB man gebannt wird, wenn man mal beleidigt (was ich ok finde und akzeptiere), sondern um die ANGABE VON GRÜNDEN! Ich wurde gebannt, OHNE ANGABE VON GRÜNDEN!

    Du kennst doch den Grund....
    Du wurdest gebannt, weil Du einen anderen Spieler beleidigt und/oder beschimpft hast....hast Du selber geschrieben und dessen bist Du Dir auch bewusst.
    Und jetzt läufst du Sturm, weil Dir das am Login-Fenster nicht vor die Nase gehalten wird?

    Dann zum Thema "Fucking Noob" und "Stop that retarded dumb".
    "Noob" ist eine Feststellung, nämlich dass der andere ein Anfänger ist - oder zumindest ein schlechter Spieler.

    Da hast Du Recht....sagt ja aber auch keiner was dagegen.
    "Noob" ist ein Synonym für "Anfänger", aber "Fucking Noob" ist es nicht.


    Nun es interessiert mich zwar herzlich wenig was einige Leute hier über mich denken....

    Achtung Ironie.....
    da behauptet wird oder gezweifelt wird ich hätte wirklich Platz 20. erreicht.

    2268 Elo, Season 1, Platz 20 Europa

    Nun einmal dürfte ich mit Platz 20 nicht zu einem Pseudo-Profi gehören und andererseits....

    Ich habe in ca. 3000+ Spielrunden in LoL kein einziges mal geleavt....

    Ich behaupte mal einfach, dein Image dürfte Dir sogar ziemlich wichtig sein.
    Wie kann man nur einen Platz 20 Spieler bannen....die stehen doch längst über den Nutzungsbedingungen....Frechheit.

    Das heißt Trollen anderer Spieler ist der Auslöser hierzu. Und anstatt den Auslöser zu bekämpfen, bannt Riot nach wie vor Flamer anstatt Trolls bevorzugt.

    Auf eine Aktion, folgt eine Reaktion.
    Heißt....um eine Aktion zu beenden, darf es keine Reaktion geben.
    Wenn Du Dich dazu anstacheln lässt, bist Du selbst Schuld.

    Troller flamet man nicht zu, man ignoriert sie....oder meldet sie.
    Mit einem Spieler über Bann-Gründe zu streiten, der sich schon selbst als Flamer bezeichnet....es gibt auch wichtigere Dinge. =)
  • in: Fehlermeldung: "Unable to find application class name"

    geschrieben von adelwoehrer

    Vielen Dank,

    das hat mein Start-Problem gelöst. =)

    Das HTML-Dokument via Browser abzurufen, liefert allerdings noch immer einen Runtime-Error.
    Screenshot: http://img841.imageshack.us/img841/522/unbenannthoc.png

    access denied? o.O
    java.lang.RuntimePermission



    Ich brauche also eine der folgenden 3 Zeilen?

    public void init();
    public void stop() ;
    public void paint(Graphics g);


    Reicht hier auch die bereits vorhandene Zeile: private void initComponents()?


    Hätte ausserdem durch rumprobieren rausgefunden, dass sich die Klassen-Definition von "public class testframe extends javax.swing.JFrame" auf "public class testframe extends javax.swing.JApplet" ändern lassen würde....das liefert mir zwar konkret keine Fehlermeldungen, aber der Build schlägt natürlich fehl. =)

    Was genau müsste denn in der Funktion "public void init();" stehen?
    Oder müsste ich die Zeile "public static void main(String args[])" damit ersetzen?



    EDIT:

    Habe die Einstellungen unter "Properties --> Run" jetzt mal auf "Run in Browser" umgestellt.
    Beim Debuggen wird mir folgende Meldung geliefert, vielleicht hilft das ja was.
    Executing C:\Dokumente und Einstellungen\XPMUser\Eigene Dateien\NetBeansProjects\test\dist\test.html using C:\Programme\Mozilla Firefox\firefox.exe
    java.lang.InterruptedException
    	at java.lang.Object.wait(Native Method)
    	at sun.plugin2.message.Queue.waitForMessage(Unknown Source)
    	at sun.plugin2.message.Pipe$1.run(Unknown Source)
    	at com.sun.deploy.util.Waiter$1.wait(Unknown Source)
    	at com.sun.deploy.util.Waiter.runAndWait(Unknown Source)
    	at sun.plugin2.message.Pipe.receive(Unknown Source)
    	at sun.plugin2.main.server.JVMInstance$WorkerThread.run(Unknown Source)
    java.lang.InterruptedException
    	at java.lang.Object.wait(Native Method)
    	at sun.plugin2.message.Queue.waitForMessage(Unknown Source)
    	at sun.plugin2.message.Pipe$2.run(Unknown Source)
    	at com.sun.deploy.util.Waiter$1.wait(Unknown Source)
    	at com.sun.deploy.util.Waiter.runAndWait(Unknown Source)
    	at sun.plugin2.message.Pipe.receive(Unknown Source)
    	at sun.plugin2.main.server.HeartbeatThread.run(Unknown Source)
    netscape.javascript.JSException: Plugin instance for applet ID 1 was already released
    	at sun.plugin2.main.server.LiveConnectSupport.getInfo(Unknown Source)
    	at sun.plugin2.main.server.LiveConnectSupport.shutdown(Unknown Source)
    	at sun.plugin2.main.server.JVMInstance.unregisterApplet(Unknown Source)
    	at sun.plugin2.main.server.JVMInstance.recycleAppletID(Unknown Source)
    	at sun.plugin2.main.server.JVMManager.recycleAppletID(Unknown Source)
    	at sun.plugin2.main.server.MozillaPlugin.stopApplet(Unknown Source)
    	at sun.plugin2.main.server.MozillaPlugin.destroy(Unknown Source)
    Exception in thread "main"







    EDIT 2:

    Das Problem lag an der "defaultCloseOperation()" für das Program.
    Diese war auf "EXIT_ON_CLOSE" gestellt, die Close Operation darf aber vom Programm innerhalb eines Browser nicht ausgeführt werden (solange das Programm nicht signiert ist), sondern muss vom Browser selbst erledigt werden, weshalb er mir diesen "access denied" Fehler zurückgab.
    Ich habe den Wert jetzt auf "DO_NOTHING" gestellt, und das Applet lädt entlich fertig....bereitet aber immer noch Probleme.

    Ich erhalte jetzt folgende Fehlermeldung:
    JavaFX application could not launch due to system configuration. See java.com/javafx for troubleshooting information.


    Bin also dem Link gefolgt.
    Das ist einfach die Downloadseite für Java Produkte....habe dort also versucht, Java und JavaFX zu aktualisieren, aber die waren beide bereits auf dem aktuellen Stand.

    Was jetzt? o.O
  • in: Fehlermeldung: "Unable to find application class name"

    geschrieben von adelwoehrer

    public static void main(String args[])

    ....wäre vorhanden.

    Hier der Link zum Tutorial:
    http://netbeans.org/kb/docs/java/quickstart-gui.html

    Und sicherheitshalber der komplette Quellcode.
    Ich habe nicht groß was gemacht bisher....das meiste wurde also automatisch erstellt.

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package testpackage;
    
    /**
     *
     * @author Nexuscrawler
     */
    public class testframe extends javax.swing.JFrame {
    
        /**
         * Creates new form testframe
         */
        public testframe() {
            initComponents();
        }
    
        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
    
            jButton1 = new javax.swing.JButton();
            jScrollPane1 = new javax.swing.JScrollPane();
            jTextArea1 = new javax.swing.JTextArea();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
            jButton1.setText("jButton1");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });
    
            jTextArea1.setColumns(20);
            jTextArea1.setRows(5);
            jScrollPane1.setViewportView(jTextArea1);
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addGap(160, 160, 160)
                            .addComponent(jButton1)
                            .addGap(0, 155, Short.MAX_VALUE))
                        .addGroup(layout.createSequentialGroup()
                            .addContainerGap()
                            .addComponent(jScrollPane1)))
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 237, Short.MAX_VALUE)
                    .addGap(18, 18, 18)
                    .addComponent(jButton1)
                    .addContainerGap())
            );
    
            pack();
        }// </editor-fold>                        
    
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            // TODO add your handling code here:
            jTextArea1.append("Test\n\r");
        }                                        
    
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            /*
             * Set the Nimbus look and feel
             */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /*
             * If Nimbus (introduced in Java SE 6) is not available, stay with the
             * default look and feel. For details see
             * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(testframe.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(testframe.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(testframe.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(testframe.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
            //</editor-fold>
    
            /*
             * Create and display the form
             */
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new testframe().setVisible(true);
                }
            });
        }
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextArea jTextArea1;
        // End of variables declaration                   
    }
  • in: Fehlermeldung: "Unable to find application class name"

    geschrieben von adelwoehrer

    Guten Abend,

    da ich nun bereits einige Erfahrung mit C# habe, wollte ich nun damit beginnen, mir Java genauer anzusehen, um auch plattformübergreifend arbeiten zu können.
    Ich habe mir also das aktuelle Java Development Kit samt Netbeans runtergeladen und mich gleich mal durch die Tutorials zu "Formen" gelesen.
    Konkret war ein kleines Applet für den Browser gedacht, allerdings habe ich bereits Probleme damit, die Anwendung zum Laufen zu bekommen, ohne groß etwas gemacht zu haben.

    Folgendes Scenario:

    New Project --> JavaFX --> JavaFX Application

    Projectname: Test
    Create Custom Preloader: Nein
    Use Dedicated Folder For Storing Libraries: Nein
    Create Application Class: Nein
    Set As Main Project: Ja


    Projekt wird erstellt.
    Danach Rechtsklick auf das leere Projekt --> New --> JFrame Form, Name (testframe) für die Klasse vergeben und Name (testpackage) des Packets vergeben.

    Ist die Form erstellt, gehe ich in den Designer und zieh einfach testhalber einen Button und ein TextArea rein, speichere das Ganze und möchte es danach kompilieren.
    Das kompilieren funktioniert....das starten des Programs via "Run" - Funktion in Netbeans funktioniert allerdings nicht.

    Ich erhalte folgende Meldung:
    Unable to find application class name


    Versuche ich, dass Program im Browser auszuführen, erhalte ich hingegen folgende Meldung:
    MissingFieldException[ Das folgende Pflichtfeld fehlt in der Startdatei: <jnlp><javafx-desc>main-class]


    Ich persönlich vermute, dass es daran liegen könnte, dass ich beim Erstellen des Projekt keinen Haken bei "Create Application Class" gesetzt habe....aber ich erstelle ja im Nachhinein sowieso eine Form mit eigenen Klassen und es wurde mir auch in den Tutorials geraten, diesen Haken nicht zu setzen.


    In meinem Package habe ich die folgenden (3?) Klassen:

    testframe.class
    testframe$1.class
    testframe$2.class



    Ich kann mir momentan nicht erklären, wo der Fehler liegt....ich finde auch bei Google keine Fehlerbeschreibung hierzu.
    Es ist mein erstes Programm in dieser Entwicklungsumgebung, habe also auch keinerlei Ansatz zur Problemlösung.

    Bitte helft einem Java Neuling. :-D
  • in: Verwenden von Attributen einer Klasse aus einer DLL

    geschrieben von adelwoehrer

    Ahhhh, verstehe.

    Ich habe die static gemacht, weil er mir sonst nicht mal mit "Test." etwas zurückgegeben hätte.
    Aber es dann trotzdem nochmal mit "new" zu versuchen, kam mir natürlich nicht in den Sinn.


    Hat geklappt, vielen Dank! :thumb:
  • in: Verwenden von Attributen einer Klasse aus einer DLL

    geschrieben von adelwoehrer

    Hallo,

    ich denke, ich hab mal wieder ein Verständnis-Problem.


    Ich bin gerade dabei, in C# eine Klassenbibliothek (.dll) zu basteln und habe Probleme damit, die Werte an eine Variable anzuknüpfen.
    Kleine Erklärung...

    Die DLL beinhaltet folgenden Code:

    namespace ClassLibrary1
    {
        public class Test
        {
            private static object xval;
    
            public static object x
            {
                get
                {
                    return xval;
                }
                set
                {
                    xval = value;
                }
            }
        }
    }


    Also einfach nur eine simple get-set Prozedur für das objekt "xval".

    Im Hauptprogramm, in dem ich diese DLL nun via Referenz und "using ClassLibrary1" eingebunden habe, steht mir die Klasse auch zur Verfügung, da habe ich jetzt aber folgendes Problem.

    Schreibe ich nun "Test." dann wird mir nach dem "." als Option das Objekt "x" angezeigt...ich kann es beschreiben und auslesen...soweit so gut also.

    Lege ich nun für die Klasse via "Test test1 = new Test()" aber eine Variable an, und gebe dann "test1." ein, steht "x" nicht zur Verfügung.
    Ich würde meine Klasse aber gerne in einer Variable anlegen, bevor ich sie verwende...wie wäre das zu lösen?


    Ich hoffe, meine Problemstellung ist soweit verständlich.
  • in: Ubuntu || Virtuelle Hosts funktionieren nicht

    geschrieben von adelwoehrer

    Das wäre mir neu.
    Es war doch sonst nie nötig, einen A-Record zu definieren, um einen virtuelle Host einzurichten.
    Warum sollte das hier plötzlich anders sein?

    Wenn ich meine Hosts Datei bearbeite, komme ich auf das selbe Ergebnis wie Du, ja, aber der Aufwand, erstmal auf den Eintrag des Records zu warten.....
    Kann ja nicht sein, da muss es noch einen anderen Fehler geben....ist der erste virtuelle Server, mit dem ich dieses Problem hab....wie gesagt, ich musste sonst nie extra einen neuen A-Record anlegen.....


    EDIT:
    ....was natürlich darauf zurückzuführen sein kann, dass bei den bisherigen Servern schon Standartmäßig eine Wildcard-Mask mit "*.killboards.de" angelegt war, die alle Variationen von Subdomains automatisch umgeleitet hat. *facepalm*
    Da war ich wohl wieder mal zu schnell mit dem posten, dein Ansatz war in jeden Fall richtig, musste das nur ein bisschen allgemeiner Eintragen. :wink:

    Werde jetzt mal warten, bis der Record aktiv sein sollte und das dann testen.


    EDIT:
    Das war's....Problem gelöst und wieder was für's Leben gelernt. :prost:
    Danke voloya!
  • in: Ubuntu || Virtuelle Hosts funktionieren nicht

    geschrieben von adelwoehrer

    Sowas dauert keine halbe Stunde, sonder zwischen 24-48 Stunden.
    Außerdem wäre das ja kein virtueller Host mehr.
    Der Sinn soll ja sein, die Sub-Domain in ein anderes Verzeichnis zu routen, als die Hauptdomain....würde ich einen solchen Record definieren, würde die Sub-Domain doch auch auf das Hauptverzeichnis zeigen.

    Das ganze hat mit den A-Records nichts zu tun, sondern ist eine Funktion von Apache.
    Apache sucht anhand der eingegebenen URL die passenden Host-Einträge und leitet die Anfrage dann in das entsprechende Verzeichnis weiter....also nicht auf "/var/www/" sondern auf "/var/www/testkb/".
  • in: Ubuntu || Virtuelle Hosts funktionieren nicht

    geschrieben von adelwoehrer

    Mir steht eine unbegrenzte Anzahl an Subdomains zur Verfügung, ich habe in dieser Hinsicht keinerlei Einschränkungen.
    Das System liegt in meinem Administrationsbereich, ich habe SSH-Zugriff und volle Root-Rechte.

Login zum Webhosting ohne Werbung!