Ankündigung

Einklappen
Keine Ankündigung bisher.

20,- Euro: Datei-Upload, SQL-AES-ENCRYPT-Insert, Ausgabe per HEADER/echo

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 20,- Euro: Datei-Upload, SQL-AES-ENCRYPT-Insert, Ausgabe per HEADER/echo

    Nach Tagen der Suche bin ich es als PHP-Anfänger satt, ich komme nicht weiter, auch mit Hilfe nicht, siehe:

    http://www.php.de/forum/webentwicklu...ung-mit-upload

    Ich suche also etwas ähnlich:

    PHP-Code:
    $kd_id  mysqli_escape_string($db$kd_id);
    $beschreibung  mysqli_escape_string($db$beschreibung);
    $name  mysqli_escape_string($db$_FILES['uploaded_file']['name']);
    $mime  mysqli_escape_string($db$_FILES['uploaded_file']['type']);
    $size  mysqli_escape_string($db$_FILES['uploaded_file']['size']);
    $data  mysqli_escape_string($dbfile_get_contents($_FILES['uploaded_file']['tmp_name']));
    $created  mysqli_escape_string($dbstrtotime("now"));

    if(
    $stmt $db->prepare("INSERT INTO `file` (`kd_id`,`beschreibung`,`name`,`mime`,`size`,`data`,`created`)
                               VALUES (AES_ENCRYPT(?,'
    $AES_SALT'), AES_ENCRYPT(?,'$AES_SALT'), AES_ENCRYPT(?,'$AES_SALT'), AES_ENCRYPT(?,'$AES_SALT'), AES_ENCRYPT(?,'$AES_SALT'), ? , AES_ENCRYPT(?,'$AES_SALT'))"))
      {
        
    $stmt->bind_param("sssssss"$kd_id,$beschreibung,$name,$mime,$size,$data,$created);
        
        
    $stmt->execute();
        
    $stmt->close();
      } 
    und die Ausgabe minimalisiert:

    PHP-Code:
    $sql7 "SELECT data FROM file WHERE id = '$id'";
       
    $result mysqli_query($db_link$sql7);
       
    $bild mysqli_fetch_row($result);
     
      
    Header("Content-Type: application/pdf"); // ändern auf $mime, also nicht statisch
      
    echo $bild[0]; 
    Also: Datei Upload (PDF, JPG etc.), verschlüsselte Ablage mit SQL-AES, Ausgabe über entsperechenden Content-Type direkt im Browser (wo möglich, wie bei PDF, Image etc.).

    Für einen Profi ist das wahrscheinlich ein Witz, ich schnalle nicht wo der Fehler steckt.

    Biete 20,- Euro für die 1. gepostete Lösung die zielführend funktioniert. Zahlung per Paypal oder auch Amazon-Wunschliste.

    Besten Dank!

  • #2
    Ausgehend von Vermutungen, woran es scheitern könnte, nehme ich vereinfacht an, dass es lediglich ein Problem beim Finden bzw. der Ausgabe gibt.
    Dies führt mich zu diesem Ergebnis, wohlwissend, dass ich mich mit der AES-Verschlüsselung bei Mysql nicht auseinandergesetzt habe und stark davon ausgehe, dass es nur eine Verzweifelungstat war, diese zu verwenden, da das Base64-Codieren nicht funktionierte.

    PHP-Code:
    $sql7 "SELECT CAST(AES_DECRYPT(data, '$AES_SALT') AS TEXT) file_decrypted, CAST(AES_DECRYPT(mime, '$AES_SALT') AS VARCHAR(255)) mime_type FROM file WHERE id = AES_ENCRYPT('$id', '$AES_SALT')";
       
    $result mysqli_query($db_link$sql7);
       
    $bild mysqli_fetch_array($result);
     
      
    Header("Content-Type: ".$bild['mime_type']);
      echo 
    $bild['file_decrypted']; 

    Kommentar


    • #3
      Das "funktionierend machen" macht das ganze aber nicht sicherer. Validation von dem was da hochgeladen wurde, fehlt gänzlich.
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar


      • #4
        @dlite: Besten Dank für den Ansatz. Dein Code produziert ein:

        Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /www/htdocs/.../file_open.php on line 56

        Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/.../file_open.php:56) in /www/htdocs/.../file_open.php on line 58
        Was meinst Du mit "Problem beim Finden"?

        Nur kurz zur Verdeutlichung: Der von mir gepostete Code funktioniert grundsätzlich, wenn man nicht mit AES verschlüsselt. Es wird also "data" gespeichert und auch als PDF geöffnet und richtig angezeigt - auf "richtig" liegt die Betonung. Nimmt man AES_ENCRYPT rein, scheitert die Ausgabe an "das PDF ist fehlerhaft", siehe

        http://www.php.de/forum/webentwicklu...ung-mit-upload

        da sich "/r" etc. einschleichen, siehe Dateianhänge von meinem Post vom 17.5. um 11.26 Uhr unter vorbenanntem Link. Der Kern des Problems ist aus meienr Sicht daher "wo wird data bei Verwendung von AES_ENCRYPT manipuliert, wie bekommt man die /r erst nicht rein bzw. notfalls verläßlich raus". Bei Verschlüsselung mit AES mittels PHP war das Problem identisch.

        Mit "Verzweifelungstat" bist Du ganz nah bei mir. Base64 war aber nur ein Versuch, AES_DECRYPT das Ziel.

        Kommentar


        • #5
          PHP-Code:
          <?php

          /**

          MySQL Create Statement für die Tabelle 'foo':

          CREATE TABLE `foo` (
            `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
            `text` varchar(45) NOT NULL,
            `data` longblob NOT NULL,
            PRIMARY KEY (`id`)
          ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

          **/

          $fileToInsert __DIR__.'/arya-stark.jpg';
          $fileToStore __DIR__.'/arya-stark-db.jpg';

          $db = new MySQLi('php-de.dev''remote''remote''test');

          $write = <<<SQL

          INSERT INTO `foo` (
              text,
              data
          ) VALUES (
              TO_BASE64(AES_ENCRYPT(?, SHA2('test-secret', 256))),
              TO_BASE64(AES_ENCRYPT(?, SHA2('test-secret', 256)))
          );

          SQL;

          $read = <<<SQL

          SELECT 
              AES_DECRYPT(FROM_BASE64(text), SHA2('test-secret', 256)) as text,
              AES_DECRYPT(FROM_BASE64(data), SHA2('test-secret', 256)) as data
          FROM `foo`
          WHERE
              id = ?

          SQL;

          $stmt $db->prepare($write);

          $text 'foobar';
          $null NULL;
          $stmt->bind_param('sb'$text$null);
          $stmt->send_long_data(1file_get_contents($fileToInsert));
          $stmt->execute();

          $id $stmt->insert_id;

          unset(
          $stmt);

          $stmt $db->prepare($read);
          $stmt->bind_param('i'$id);

          $stmt->execute();
          $stmt->bind_result($text$binary);
          $stmt->fetch();

          file_put_contents($fileToStore$binary);

          var_dump(
              
          md5_file($fileToInsert) === md5_file($fileToStore),
              
          md5_file($fileToInsert),
              
          md5_file($fileToStore)
          );
          $fileToInsert und $fileToStore solltest du konfigurieren. Das hier Funktioniert garantiert.
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            Das hier Funktioniert garantiert.
            und es benützt nicht die passparaphrase als key, sondern wenigstens einen hash von ihr.

            Kommentar


            • #7
              Zitat von moma Beitrag anzeigen
              und es benützt nicht die passparaphrase als key, sondern wenigstens einen hash von ihr.
              Best Practice halt.

              Joy ich hab aus guten Grund hier nicht deinen Sourcecode angepasst, sondern dir das Test-Script gebaut, weil du deine Datenbank wahrscheinlich noch anpassen musst ( BLOB ).
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                @tr0y: Besten Dank für das Script und die Benachrichtigung. Heute bin ich mit der Familie ausgelastet, habe aber morgen Zeit für einen Test. Bin sehr gespannt! Das du es nicht angepasst hast, schafft uns gleiche Bedingungen und ist daher sinnvoll. Mir ist aber nicht klar, wie ich später dein file_get_contents auf den Upload anpassen soll. Bei der Ausgabe in Browser eher, es wäre aber dennoch schön, wenn du mir dazu einen Ansatz liefern könntest.

                Oh, unser Besuch ist da ...

                Data ist bei mir MEDIUMBLOB, ändere ich ab.

                Ich betrachte das Problem als gelöst. Bis morgen und Besten Dank vorab. Bevorzugst du PayPal oder deine Wunschliste?

                Gruß!

                Kommentar


                • #9
                  Wunschliste, dein upload liegt im temp-Ordner und kann als reguläre Datei geöffnet werden ( mit file_get_contents() ). Aber das erklär ich dir dann morgen wenn es wo klemmt.
                  [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                  Kommentar


                  • #10
                    ich hab natürlich keine ahnung was für ein block encryption modeder TE benüzt.
                    alle ausser ausser ecb sollten den ab 5.74 möglichen initialisierungvector benützen, gebe ich da noch zu bedenken.

                    Kommentar


                    • #11
                      MySQL nutzt ECB. AES kann man auch nicht weiter konfigurieren.
                      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                      Kommentar


                      • #12
                        wenn du meinst:
                        Zitat von http://dev.mysql.com/worklog/task/?id=6781
                        These are using a relatively insecure key size (128 bits, corresponding to "SECRET" according to NSA) and block mode (ECB, encrypting equal blocks with equal code blocks) to calculate the cipher.
                        Zitat von http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_block_encryption_mode
                        • For OpenSSL, permitted mode values are: ECB, CBC, CFB1, CFB8, CFB128, OFB
                        • For yaSSL, permitted mode values are: ECB, CBC

                        Kommentar


                        • #13
                          This variable was added in MySQL 5.6.17
                          Ich hab die Dokumentation nicht als Newsfeed.

                          Vielleicht auch noch ganz interessant dazu für den TE: http://dev.mysql.com/doc/relnotes/my...ws-5-6-17.html
                          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                          Kommentar


                          • #14
                            Habe soeben mich an einen Versuch gemacht. Die Tabelle ist neu:

                            PHP-Code:
                            CREATE TABLE `file` (
                              `
                            idint(10unsigned NOT NULL AUTO_INCREMENT,
                              `
                            kd_idvarchar(256NULL,
                              `
                            beschreibungvarchar(256NOT NULL,
                              `
                            textvarchar(256NOT NULL,
                              `
                            namevarchar(256NULL,
                              `
                            mimevarchar(256NULL,
                              `
                            sizevarchar(256NULL,
                              `
                            createdvarchar(256NULL,
                              `
                            datalongblob NOT NULL,
                              
                            PRIMARY KEY (`id`)
                            ENGINE=InnoDB DEFAULT CHARSET=utf8;    
                               
                            "; 
                            Die Anpassung an mein Formular gestaltet sich für mich schwierig, ich verstehe zu wenig. Das ist mein Versuch:

                            PHP-Code:
                            <?php
                             
                                 
                            // kd_id übernehmen
                                    
                            $kd_id $_GET["kd_id"];
                                    if(!isset(
                            $kd_id)) {echo "Keine kd_id übergeben!<br>"; exit;}
                                
                            // Beschreibung übernhmen    
                                    
                            $beschreibung $_GET["beschreibung"];
                                    
                            // noch absichern
                                    
                                // Testkey
                                    
                            $testkey 'testtest123';
                                    
                                
                            // Prüfen ob hochgeladen wurde
                                    
                            if(isset($_FILES['uploaded_file'])) {
                                
                            // und fehlerfrei ist
                                    
                            if($_FILES['uploaded_file']['error'] == 0) {
                                    
                            // Connect to the database
                                    
                                // Datenbankverbindung
                                    
                            require_once ('konfiguration.php');

                                
                            // Datum bereitstellen
                                    
                            $created strtotime("now");

                                
                            // tr0y start
                                
                                    
                            $fileToInsert $_FILES['uploaded_file']['tmp_name'];
                                    
                            $fileToStore __DIR__.$_FILES['uploaded_file']['name'];
                                            
                                    
                            $db $db_link2
                                    
                            //$db = new MySQLi('php-de.dev', 'remote', 'remote', 'test');
                                    
                                    
                            $write = <<<SQL
                                    
                                    INSERT INTO `file` (
                                        text,
                                        data
                                    ) VALUES (
                                        TO_BASE64(AES_ENCRYPT(?, SHA2(
                            $testkey, 256))),
                                        TO_BASE64(AES_ENCRYPT(?, SHA2(
                            $testkey, 256)))
                                    );
                                    
                                    SQL;
                                    
                                    
                            $read = <<<SQL
                                    
                                    SELECT
                                        AES_DECRYPT(FROM_BASE64(text), SHA2(
                            $testkey, 256)) as text,
                                        AES_DECRYPT(FROM_BASE64(data), SHA2(
                            $testkey, 256)) as data
                                    FROM `file`
                                    WHERE
                                        id = ?
                                    
                                    SQL;
                                    
                                    
                            $stmt = $db->prepare($write);
                                    
                                    
                            $text = $_GET["beschreibung"];
                                    
                            $null = NULL;
                                    
                            $stmt->bind_param('sb', $text$null);
                                    
                            $stmt->send_long_data(1, file_get_contents($fileToInsert));
                                    
                            $stmt->execute();
                                    
                                    // Vergleich der Dateien oder wofür ist das?
                                    
                            $id = $stmt->insert_id;
                                    
                                    unset(
                            $stmt);
                                    
                                    
                            $stmt = $db->prepare($read);
                                    
                            $stmt->bind_param('i', $id);
                                    
                                    
                            $stmt->execute();
                                    
                            $stmt->bind_result($text$binary);
                                    
                            $stmt->fetch();
                                    
                                    file_put_contents(
                            $fileToStore$binary);
                                    
                                    var_dump(
                                        md5_file(
                            $fileToInsert) === md5_file($fileToStore),
                                        md5_file(
                            $fileToInsert),
                                        md5_file(
                            $fileToStore)
                                    );
                                
                                // tr0y ende

                                //
                                 if(
                            $stmt) {
                                        echo "Übernahme der Datei 
                            $fileToStore in die Datenbank war erfolgreich! Gleich wird zum Kunden geleitet ...";
                                        // etc.
                                    }
                                    else {
                                        echo 'Fehler! Die Datei konnte nicht gespeichert werden '
                                           . "<pre>
                            {$db_link->error}</pre>";
                                    }
                                }
                                else {
                                    echo 'Fehler beim Uploadvorgang. '
                                       . 'Fehlercode: '. intval(
                            $_FILES['uploaded_file']['error']);
                                }
                             
                                // Verbindung schliessen
                                
                            $db_link2->close();
                            }
                            else {
                                echo 'Fehler! Keine Datei angegeben!';
                            }
                             
                            ?>
                            Rufe ich diese Seite auf, kommt folgender Fehler:

                            Parse error: syntax error, unexpected '$write' (T_VARIABLE) in /www/htdocs/.../add_troy.php on line 41
                            Die Zeile dazu:

                            Code:
                            $write = <<<SQL
                            Dein Code

                            PHP-Code:
                                $id $stmt->insert_id;
                                    
                                    unset(
                            $stmt);
                                    
                                    
                            $stmt $db->prepare($read);
                                    
                            $stmt->bind_param('i'$id);
                                    
                                    
                            $stmt->execute();
                                    
                            $stmt->bind_result($text$binary);
                                    
                            $stmt->fetch();
                                    
                                    
                            file_put_contents($fileToStore$binary);
                                    
                                    
                            var_dump(
                                        
                            md5_file($fileToInsert) === md5_file($fileToStore),
                                        
                            md5_file($fileToInsert),
                                        
                            md5_file($fileToStore)
                                    ); 
                            Begrife ich nur "Test ob die Daten identisch sind", der kann später raus?

                            Die gehst hier von Bilddateien aus, es könne bei mir aber diverse sein, meist JPG und PDF. Sehe ich es richtig, daß für die Ausgabe im Browser in der DB noch min. eine Art

                            PHP-Code:
                            $mime $dbLink->real_escape_string($_FILES['uploaded_file']['type']); 
                            benötige um "Header" angeben zu können.

                            Viele Unklarheiten. Es erscheint mir doch sinnvoll, wenn du den Code an meine Bedürfnisse anpasst und ich das dann in Ruhe nachvollziehe. Es mag dir fremd sein, aber "mal schnell etwas anpassen" ist bei mir nicht, ich muß fast alles nachLESEN was was macht ...

                            Habe keinen zweifel das wir mein Ziel erreichen. Besuche nun deine Wunschliste und gehe dann spazieren, das Thema "AES und Upload" stresst mich schon beim Gedanken daran.

                            Kommentar


                            • #15
                              Ich hab deinen Quellcode mal geordnet:

                              PHP-Code:
                              <?php

                              /**
                               * Konfiguration
                               *
                               * @hook Includes hier
                               * @hook Variablen hier
                               *
                               * @see http://php.net/manual/de/language.types.string.php#language.types.string.syntax.heredoc
                               */

                              // Datenbankverbindung
                              require_once ('konfiguration.php');

                              // Settings
                              $testkey 'testtest123';
                              $created time();

                              // Templates
                              $write = <<<SQL

                              INSERT INTO `file` (
                                  text,
                                  data
                              ) VALUES (
                                  TO_BASE64(AES_ENCRYPT(?, SHA2(
                              $testkey, 256))),
                                  TO_BASE64(AES_ENCRYPT(?, SHA2(
                              $testkey, 256)))
                              );

                              SQL;

                              $read = <<<SQL

                              SELECT
                                  AES_DECRYPT(FROM_BASE64(text), SHA2(
                              $testkey, 256)) as text,
                                  AES_DECRYPT(FROM_BASE64(data), SHA2(
                              $testkey, 256)) as data
                              FROM `file`
                              WHERE
                                  id = ?

                              SQL;

                              /**
                               * EVA => Eingabe 
                               *
                               * @see http://php.net/manual/de/language.types.type-juggling.php#language.types.typecasting
                               * @see http://php.net/manual/de/function.filter-has-var.php
                               * @see http://php.net/manual/de/language.operators.comparison.php#language.operators.comparison.ternary
                               */
                              $kd_id filter_has_var(INPUT_GET'kd_id'
                                  ? (int) 
                              $_GET['kd_id']                                              # type cast
                                  
                              null                                                              # default
                              ;

                              $beschreibung filter_has_var(INPUT_GET'beschreibung'
                                  ? 
                              filter_input(INPUT_GET'beschreibung'FILTER_SANITIZE_STRING)   # sanitization
                                  
                              null                                                              # default
                              ;

                              /**
                               * EVA => Verarbeitung
                               *
                               * @see http://php.net/manual/de/function.sprintf.php
                               * @see https://blogs.oracle.com/oswald/entry/php_s_mysqli_extension_storing
                               */

                              if ( $kd_id && ! empty($beschreibung) && ( array_key_exists('uploaded_file'$_FILES) && ! $_FILES['uploaded_file']['error'] ) )
                              {
                                  
                              $fileToInsert $_FILES['uploaded_file']['tmp_name'];
                                  
                              $fileToStore sprintf('%s/%s'__DIR__$_FILES['uploaded_file']['name']);
                                  
                                  
                              $db $db_link2;
                                  
                                  
                              $stmt $db->prepare($write);

                                  
                              $null NULL;
                                  
                              $stmt->bind_param('sb'$beschreibung$null);
                                  
                              $stmt->send_long_data(1file_get_contents($fileToInsert));
                                  
                              $stmt->execute();

                                  
                              // Vergleich der Dateien oder wofür ist das?
                                  
                              $id $stmt->insert_id;

                                  unset(
                              $stmt);

                                  
                              $stmt $db->prepare($read);
                                  
                              $stmt->bind_param('i'$id);

                                  
                              $stmt->execute();
                                  
                              $stmt->bind_result($text$binary);
                                  
                              $stmt->fetch();

                                  
                              file_put_contents($fileToStore$binary);
                                  
                                  
                              var_dump(
                                      
                              md5_file($fileToInsert) === md5_file($fileToStore),
                                      
                              md5_file($fileToInsert),
                                      
                              md5_file($fileToStore)
                                  );
                              }

                              /**
                               * EVA => Ausgabe
                               *
                               * @see http://php.net/manual/de/function.sprintf.php
                               * @see https://blogs.oracle.com/oswald/entry/php_s_mysqli_extension_storing
                               */

                              else 
                              {
                                  if ( 
                              $kd_id 
                                  {
                                      echo 
                              'Kunden-ID ist falsch.';
                                  }
                                  else if ( ! 
                              array_key_exists('uploaded_file'$_FILES) ) 
                                  {
                                      echo 
                              'Fehler beim Upload: keine Datei angegeben!'
                                  }
                                  else if ( 
                              $_FILES['uploaded_file']['error'] ) 
                                  {
                                      echo 
                              sprintf('Fehler beim Upload. (Fehlercode: %s)'$_FILES['uploaded_file']['error']);
                                  }
                                  else {
                                      echo 
                              'Irgendetwas ging schief.';   
                                  }
                              }

                              if ( 
                              $stmt 
                              {
                                  echo 
                              sprintf('Übernahme der Datei %s in die Datenbank war erfolgreich! Gleich wird zum Kunden geleitet ...'$fileToStore);
                                  
                              // etc.
                              }
                              else 
                              {
                                  echo 
                              sprintf('Fehler! Die Datei konnte nicht gespeichert werden <pre>%s</pre>'$db_link->error);

                              }

                              /**
                               * Hinweis:
                               *
                               * In PHP ist der PHP-Endtag optional und kann in Scripten die keinen Kontext-Wechsel betreiben weggelassen werden.
                               */

                              /**
                               * php <dieses script> -l
                               * No syntax error detected
                               */
                              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                              Kommentar

                              Lädt...
                              X