Ankündigung

Einklappen
Keine Ankündigung bisher.

sichere URL zur Datenbankabfrage

Einklappen

Neue Werbung 2019

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

  • sichere URL zur Datenbankabfrage

    Hallo zusammen,

    wir nutzen einen Webservice, welcher uns ein PDF aus URL-Parametern generiert. Beispielhaft: http://www.....de/name/hans/quantity...r-id/123456789
    Daraus würde ein PDF mit den mitgegebenen Daten erzeugt werden. Das Schema ist also für viele leicht verständlich und kann mühelos missbraucht werden, was hier nicht gewünscht ist.

    Der Webservice kann nicht umgeschrieben werden, weswegen ich an einer anderen Lösung arbeite. Ziel ist es weiterhin der Person einen Link zur Verfügung zu stellen, mit welchem er seine PDF downloaden kann. Ob direkter Download oder ein Button auf einer Landingpage ist dabei ganz egal.

    Meine aktuelle Idee:
    Eine Datenbanktballe mit ID, Name, Quantity, Order-ID

    Ich verschlüssel die ID, welche anschließend als Paramter der neuen unleserlichen URL mitgegeben wird. Beim Aufruf der URL wird die ID entschlüsselt und in der Datenbank geschaut, welcher Eintrag dort hinterlegt ist.
    Die Daten werden übergeben und daraus eine Landingpage erzeugt, die jetzt sogar personalisiert sein kann.
    Ein Button wird erzeugt, welcher aus den einzelnen Tupeln eine URL im obigen, leserlichen Schema erzeugt, sodass der Download gestartet werden kann.

    Nun habe ich dabei aber Sicherheitsbedenken:
    Wenn ich die ID ver- und entschlüsseln kann, dann kann es ggf auch jemand anders und kann somit die gesamte Datenbank auslesen, wodurch er an alle Einträge käme.

    Wie könnte ich es sicherer gestalten?

    Gibt es vielleicht noch bessere sinnvollere Ideen?

    Gruß
    Sebastian

  • #2
    Ich verschlüssel die ID
    Wozu? Solange die ID aus der neuen Tabelle nichts mit der anderen ID gemein hat, ist das "Verschlüsselung" genug. Und damit sich jemand kein fremden Datensätze ansehen kann, musst du lediglich zu jedem Datensatz hinterlegen, wer darauf zugreifen darf.

    Wenn ich die ID ver- und entschlüsseln kann, dann kann es ggf auch jemand anders
    Aber nur, wenn er deinen Schlüssel kennt ...

    Kommentar


    • #3
      Hallo Sebastian, vielleicht hilft Dir auch FPDF weiter dann bleibt alles in Deiner Hand.
      Gruss
      Michael

      Kommentar


      • #4
        Generiere doch einfach einen Code den du mit in der Datenbank ablegst und dann dem User mitgibst. Im einfachsten Fall sowas wie
        PHP-Code:
        $code md5(microtime(true)); 
        Sinnvoll wäre es auch noch ein Verfallsdatum mit in die Datenbank aufzunehmen.

        Kommentar


        • #5
          Vielen Dank für eure Antworten

          Kommentar


          • #6
            Ab PHP7 nimm besser random_bytes() statt md5() und microtime().

            PHP-Code:
            var_dumpmd5(microtime(true)) );
            var_dumpmd5(microtime(true)) );

            var_dumpbin2hex(random_bytes(16)) );
            var_dumpbin2hex(random_bytes(16)) );

            /*
            string(32) "a385f7c7b38d9bd5fbfc4e8f405d7f25"
            string(32) "a385f7c7b38d9bd5fbfc4e8f405d7f25"

            string(32) "9c1ad39360c906baee1205f2b1c38640"
            string(32) "7023769b4345387e0b49f502739ab117"
            */ 
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Oder du machst es ohne Datenbank und speicherst auch sonst nichts und übergibst alle Daten in der URL. Hier ein Beispiel wie es in etwa gelöst werden könnte:

              PHP-Code:
              function securedownload_hash(string $fileNamestring $secretint $expires): string {
                  
              $parts = [$secret$expires$fileName];
                  return 
              sha1(implode(':'$parts));
              }

              function 
              securedownload_query(string $fileNamestring $secretint $lifetime 86400): string {
                  
              $expires time() + $lifetime;
                  
              $hash securedownload_hash($fileName$secret$expires);
                  return 
              http_build_query([
                      
              'fileName' => $fileName,
                      
              'expires' => $expires,
                      
              'hash' => $hash
                  
              ]);
                  return 
              $query;
              }

              function 
              securedownload_validate($fileName$secret$expires$hash): bool {
                  if(
              $expires <= time()) {
                      return 
              false;
                  }
                  
              $check securedownload_hash($fileName$secret$expires);
                  if(!
              hash_equals($hash$check)) {
                      return 
              false;
                  }
                  return 
              true;

              URL erstellen mit:

              PHP-Code:
              $secret 'foobar';
              $query securedownload_query('secretfile.txt'$secret3600);
              $url 'http://example.com/download.php?'.$query
              Validieren mit:

              PHP-Code:
              if(securedownload_validate('secretfile.txt'$secret1545158169'a9b87cc18110324af5541a5f7fdf87b4259dfb69')) {
                  
              var_dump('valid');

              Kommentar


              • #8
                Wenn ich die ID ver- und entschlüsseln kann, dann kann es ggf auch jemand anders und kann somit die gesamte Datenbank auslesen, wodurch er an alle Einträge käme.
                Von außen wird das schwierig - Dafür ist die Verschlüsselung ja da. Von innen, also wenn der Angreifer z. B. Zugriff auf Deine Datenbank und den Encryption Key hat, dann ist es eh zu spät - Irgendwo musst Du Deiner Applikation vertrauen.

                Alternativ zu dieser Verschlüsselung: Wie wäre es mit UUIDs statt numerischer IDs?

                Kommentar

                Lädt...
                X