Zugangsbeschränkung von Download-Dateien auf Webserver?

3 Antworten

Zunächst mal sorge dafür, dass sich die Benutzer einloggen können und du bzw. dein Server die Möglichkeit (z.B. per Session) das "eingeloggt sein" zu verifizieren.

Dann passe folgende Skizze soweit an, dass sie zum bei dir vorhandenen Konzept passt:

<?php
    $files = array(
        'covfefe' => 'nuke_launch_codes.pdf',
        'yes_we_can' => 'obama_secret_plans.doc'
    );
    if(isset($_GET['file'])){
        $fileid = $_GET['file'];
        if(!isset($files[$fileid])){
            header('HTTP/1.0 404 Not Found');
            header('Connection: close');
            exit(0);
        }
        else{
            $file = $files[$fileid];
            header('Content-Type: '+mime_content_type('top_secret_folder/'.$file));
            header('Content-Length: '+filesize('top_secret_folder/'.$file));
            header('Content-Disposition: attachment; filename="'+$file+'"');
            readfile('top_secret_folder/'.$file);
            exit(0);
        }
    }

Beispielanwendung:

Du hast auf deinem Server ein Verzeichnis namens "top_secret_folder", auf das (auf welche Weise auch immer) nicht über HTTP zugegriffen werden kann.

In diesem Verzeichnis befinden sich die zwei Dateien "nuke_launch_codes.pdf" und "obama_secret_plans.doc".

Das obige Skript ist unter http://mirdochegal.de/it-s-magic.php zu erreichen.

Wird nun http://mirdochegal.de/it-s-magic.php?file=covfefe vom (authentifizierten) Browser angefordert, dann erhält dieser die Antwort, dass ihm gleich eine Datei zugestellt wird, die er optimalerweise unter dem Namen "nuke_launch_codes.pdf" in seinem "Downloads"-Ordner abspeichern soll, gefolgt vom Inhalt der Datei.

Aber, wie gesagt, das Skript ist mehr eine Skizze als komplett fertig.

Zu überarbeiten wären da u.a. noch:

  • Die Authentifizierung (kein Passwort, keine Datei).
  • Evtl. ein Fallback, falls dem Server zwar die ID bekannt ist, die Datei aber aus welchem Grund auch immer nicht da ist, wo sie sein sollte (im einfachsten Fall ein klassisches 404).
  • Ggf. eine Datenbankanbindung anstelle eines Arrays (sonst wirds bei vielen Dateien früher oder später "lustig").
  1. wieso Verschlüsselung?
  2. willst du eine Zugangsbeschränkung? das ginge mit Passwort-geschützten Seiten... oder mit kryptographisch sicheren URLs (d. h. man kann diese URLs nicht leicht raten... z. B. http://www0.bla.org/a6JY6929R7CZcg.pdf )...
  3. oder willst du die Datei jedem geben und nur die „Eingeweihten“ können dann auch was mit dem Inhalt anfangen? das ginge mit One-Time-Pad...

pst0042 
Beitragsersteller
 28.02.2020, 16:11

Ja ich meine natürlich eine Zugangsbeschränkung. Wie muss ich eine kryptographisch sichere URL erstellen? Reicht da ein Verzeichnis mit willkürlichen Zeichen oder gehört da mehr dazu?

Bei den Passwortgeschützten Seiten könnte ich einfach die Benutzerdaten über die URL weitergeben oder hast du da eine bessere Idee?

EinAlexander  28.02.2020, 16:18
@pst0042
Wie muss ich eine kryptographisch sichere URL erstellen?

Gar nicht. Dieses komplette unsinnige Konzept nennt man "security by obscurity" und funktioniert nicht. Die URL verbreitet sich ruckzuck über refererer oder dgl. und wird dann sogar über Suchmaschinen gefunden.

Bei den Passwortgeschützten Seiten könnte ich einfach die Benutzerdaten über die URL weitergeben

Auf keinen Fall. Auch dann verbreitetn die sich über referer oder dgl.

pst0042 
Beitragsersteller
 28.02.2020, 16:21
@EinAlexander

Ok und wie soll ich das dann am besten umsetzen?

RIDDICC  28.02.2020, 18:43
@EinAlexander

sicher? der referer Mechanismus setzt doch wohl voraus, dass es Links auf den sicheren Seiten gibt, die auf andere Sites führen... davon war ja gar keine Rede...

RIDDICC  28.02.2020, 18:44
@pst0042
  1. über Cookies könnte man es noch machen...
  2. oder über HTML-Forms, die versteckte Eingabefelder mit einem kryptographisch sicheren Code enthalten, den man nur kriegt, wenn man zuvor eine Rätselaufgabe gelöst hat (Beispiel-Rätsel: „Sage mir dein Passwort.“)...
EinAlexander  28.02.2020, 18:54
@RIDDICC
sicher?

Ja, sicher. "https://de.wikipedia.org/wiki/Security\_through\_obscurity" rel="noopener noreferrer" target="_blank">Security through obscurity" war schon immer ein untaugliches Konzept. Fakt ist, der URL http://www.example.org/a6JY6929R7CZcg.pdf ist nicht geschützt. Wenn ich den in meinen Chrome Browser eintippe, weiß Google Bescheid, dass es diesen URL gibt. Und da der Inhalt nicht geschützt ist, steht er offen im Web.

Je nach Inhalt der Datei kann es zudem dramatische rechtliche Konsequenzen haben, wenn die zu schützenden Dateien ungeschützt im Web stehen: https://www.handelsblatt.com/technik/sicherheit-im-netz/ungesicherte-server-millionen-patientendaten-ungeschuetzt-im-netz-aufgetaucht/25023120.html?nlayer=Themen\_11804704

RIDDICC  28.02.2020, 19:20
@EinAlexander
  1. du meinst durch die Benutzung eines bestimmten Browers (namentlich: Chrome) wird die URL-Verschlüsselung des HTTPS teilweise ausgehebelt?
  2. das wäre ja skandalös und ein Grund es nicht zu verwenden...
  3. „security by obscurity“ ist ja eher, wenn man die Funktionsweise des Verfahrens geheimhalten muss... das ist in meinem Vorschlag aber nicht der Fall... da muss man nur das Geheimnis geheim halten... das Problem hat aber jedes Verfahren...
  4. geschnallt?
EinAlexander  28.02.2020, 19:59
@RIDDICC
du meinst durch die Benutzung eines bestimmten Browers (namentlich: Chrome) wird die URL-Verschlüsselung des HTTPS teilweise ausgehebelt?

Nein. Informier Dich mal über die Funktiion von SSL. Wenn Du einen URL im Browser eingibst, bedeutet das nicht, dass dieser URL nicht "weitergegeben" wird. Woher glaubst du kommen die ganzen mit https: beginnenden URLs im Google-index?

„security by obscurity“ ist ja eher, wenn man die Funktionsweise des Verfahrens geheimhalten muss

Nein. Security through obscurity bedeutet im Kontext von URLs, dass man diese dadurch glaubt geheimhalten zu können, dass man sie "verschlüsselt" durch vermeintlich schwer zu erratende Zeichenfolgen.

RIDDICC  28.02.2020, 20:42
@EinAlexander
  1. du meinst, dass HTTPS die URLs, die an den Server übertragen werden, nicht verschlüsselt?
  2. das, was du über „security by obscurity“ schreibst, ist hoffnungslos falsch...
  3. versuch mal das da durch kleine korrekte Schlusfolgerungen zum Widerspruch zu führen: das Geheimnis ist eben die URL selbst und wenn man es nich geheim hält, weil man n komischen Browser verwendet, dann ist es eben kein Geheimnis mehr, was aber gerade nicht an dem Konzept selbst liegt... versuch mal das zum Widerspruch zu führen...
  4. du solltest auch mal eine konzise Definition des Begiffs „security by obscurity“ aufschreiben... grins
EinAlexander  28.02.2020, 22:06
@RIDDICC
das Geheimnis ist eben die URL

sie ist eben nicht geheim. Welchen Unterschied macht es ob man die Datei datei.pdf oder hduegrfsf.pdf nennt?

RIDDICC  28.02.2020, 23:28
@EinAlexander
  1. manno!
  2. der Unterschied ist, dass die URL so wie ein Passwort schwer zu erraten ist...
  3. „2020-02-28.log“ ist vergleichsweise leicht zu erraten...
  4. deine These, dass jeder WWW-Browser die URLs öffentlich zugänglich macht, ist hoffentlich falsch...
  5. allenfalls Virenscanner leiten URLs weiter an ihre Forschungs-Abteilung... das hatte ich mal mit ner Arztpraxis: immer wenn der Arzt im UK sone kryptographisch sichere URL aufrief, kam derselbe Aufruf nochmal (aber dieses Mal aus Japan)... LOL aber das wäre noch kein Versagen des Systems, weil der Virenscanner ja ohnehin Zugang zu Allem hat...
RIDDICC  29.02.2020, 08:41
@EinAlexander

ach so: wenn ich will, dass eine Seite von der Google/Suche gefunden wird, dann trag ich sie bei Google/Analyze ein... ich warte doch nich, dass jemand zufällig meine neue Seite mit nem Verräter-Browser ansurft... LOL

EinAlexander  29.02.2020, 09:36
@RIDDICC
dann trag ich sie bei Google/Analyze ein

Wohl nicht bei google Analyze sondern eher in der Google Search Console.

Was aber nichts daran ändert dass auch Seiten im Index von Google landen, die nicht via Google Search Console im Index angemeldet wurden, die nicht für die Öffentlichkeit bestimmt sind und bei denen der Seiteninhaber nicht ahnt, dass sie für jedermann öffentlich zugänglich sind. Zum Beispiel diese Seite: http://www.amann-kaffee.at/stats/usage_202002.html

Und die würde natürlich auch dann im google Index stehen, wenn der URL http://www.amann-kaffee.at/tubut/vtbhe_202002.html lauten würde.

RIDDICC  29.02.2020, 09:51
@EinAlexander
  1. öhm!?
  2. wenn du auf dieser Seite einen Link auf deine angeblich „geleakte“ Seite packst, dann findet Google die na klar auch... LOL das ist ja was ganz anderes (keine /robots.txt file...)...
  3. und ich benutz eben Google Analyze... so... LOL einfach immer nur „nein“ sagen, ist Quatsch... woher willst du überhaupt wissen, wie ich sowas mache? ganz schön anmaßend... findest du nich auch?
RIDDICC  29.02.2020, 10:26
@EinAlexander

LOL nein... da würde ich n ganzes Verzeichnis ausschließen... sonst lädt sich einfach einer die robots.txt runter und hat die ganzen geheimen URLs... immer n bisschen mitdenken, damit es nich so viel Gelaber gibt...

EinAlexander  29.02.2020, 10:53
@RIDDICC
da würde ich n ganzes Verzeichnis ausschließen

Das verhindet aber nicht, dass auf dieses Verzeichnis zugegriffen werden kann und wird und der URL der "geheimen" Datei publiziert wird. Email harvester, Spambots, Malware usw. halten sich nicht an die Angaben der robots.txt

RIDDICC  29.02.2020, 10:59
@EinAlexander
  1. das Verzeichnis kann na klar auch nich gelistet werden... :)
  2. ich verstehe nicht, wie deiner Meinung nach die URL, die ich dir bspw. per eMail schicke, „publiziert“ werden soll..
  3. meinst du jetzt auch noch, dass private eMails ausgewertet und zumindest teilweise veröffentlicht werden?
  4. und Schadsoftware ist na klar immer das Ende der Sicherheitskonzepte... Schadsoftware könnte dir auch irgendeinen Quatsch am Bildschirm vorgaukeln und über das Netzwerk schickt sie was ganz anderes... Bsp.: ne Online Banking Transaktion mit smsTAN... da steht bei einer meiner Banken bloß die Transaktions-Nummer in der SMS (also keine Überweisungs-Details...)... kicher
EinAlexander  29.02.2020, 11:10
@RIDDICC
ich verstehe nicht, wie deiner Meinung nach die URL, die ich dir bspw. per eMail schicke, „publiziert“ werden soll

so wie sie bekannt wird, wenn Du sie mir auf einer Postkarte schickst. Denn eine e-Mail ist nicht sicherer als eine Postkarte. Nur wenn die Mail zum Beispiel mit PGP verschlüsselt wurde, bleibt der Inhalt Dritten auf jeden Fall unbekannt.

meinst du jetzt auch noch, dass private eMails ausgewertet und zumindest teilweise veröffentlicht werden?

Ich meine dass es sicherer ist, den Zugriff auf eine geheime Datei so zu verhindern, dass niemand Unbefugtes darauf zugreifen kann anstatt sie für jeden zugänglich ins Internet zu stellen, ihr einen ungewöhnlichen Namen zu geben und inständig zu hoffen, der "geheime" URL tauche nirgendwo auf.

Wenn Dein Konzept der "geheimen" URLs funktionieren würde, könnten Banken komplett darauf verzichten den Zugriff aufs Konto nur per PIN zu ermöglichen https://kunden.commerzbank.de/lp/login und stattdesen jedem Kunden eine unglaublich geheime URL zuweisen für seine Bankgeschäfte in der Art
https://www.commerzbank/kundenkonto/a6JY6929R7CZcgtfger94_xzZZufg/

Würdest Dir das als "Sicherheit" genügen?

RIDDICC  29.02.2020, 11:15
@EinAlexander
  1. PGP ist nicht erweislich sicher... das kann man höchstens vermuten...
  2. du befürchtest also, dass da irgendetwas bei deinem EmailProvider oder InternetProvider oder WWWBrowser ist, das private Daten (angesurfte URLs, private eMails, ...) im Internet veröffentlcht... stümnt's?
  3. aber: was hindert dieses Etwas daran, noch ganz andere Sachen zu veröffentlichen? z. B. die Passwörter, die du ja im Klartext eintippst.... oder auch Cookies, die Geheimnisse zum Identitäts-Nachweis enthalten...
  4. huh? wassn? LOL
EinAlexander  29.02.2020, 11:34
@RIDDICC
du befürchtest also,

Ich befürchte gar nichts. Ich erkläre nur, dass es nicht sicher ist, eine Datei dadurch vor Zugriff zu schützen, indem man ihr einen ungewöhnlichen Namen gibt und sie dann ohne Zugriffsbeschränkung für jeden verfügbar ins Internet stellt.

Wenn das für Dich ein Sicherzeitskonzept ist, dass ein Facharzt eine Patientenakte ungeschützt unter dem URL http://arztpraxis.tld/asdfoijj2523454hjk0987vkl.pdf ins Internet stellt und dem Kollegen Hausarzt mailt: "Die Ergebnisse der Facharztuntersuchnung für Ernst Müller finden Sie unter dem URL http://arztpraxis.tld/asdfoijj2523454hjk0987vkl.pdf", ist das ja okay.

RIDDICC  29.02.2020, 12:28
@EinAlexander
  1. nö...
  2. du erklärst nix...
  3. warum z. B. sollten nicht auch Inhalte von HTML-Forms, die du weiter unten empfiehlst, irgendwie im öffentlichen Internet geleakt werden können? ist sogar schon mehrfach vorgekommen... sogar bei Yahoo!Mail...
  4. für Patientenakten müsste man na klar n spezielles Betriebssystem und harte Kryptographie verwenden... aber ich habe den Verdacht, dass die Ärzte sich da auf Microsoft und HTTPS und n per Briefpost überlassenes Passwort verlassen...
Verschlüsselung von Download-Dateien auf Webserver?

Hier das Prinzip;


<form method="post">
  <input type="password" name="password" />
  <input type="submit" value="Download" />
</form>

<?php
    $pw = md5($_POST['password']);
    $gueltigesPasswort = md5("geheimesPasswort");
    if($pw == $gueltigesPasswort)
   {
       header("Location: /server/pfad/zur/download/datei.pdf");
   }
?>

Alex


pst0042 
Beitragsersteller
 28.02.2020, 16:22

Mit einem header() komme ich ja aber auch nicht auf nicht öffentliche Verzeichnisse eines Webservers, oder?

EinAlexander  28.02.2020, 16:28
@pst0042

Dann änder den header eben wie folgt:

header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="downloadName.pdf"');
readfile('originalName.pdf');