Zugangsbeschränkung von Download-Dateien auf Webserver?
Hallo zusammen,
auf meiner Homepage habe ich einen internen Bereich mit PHP Sessions und MySQL-Datenbank, bei dem man sich über ein Formular einloggen kann.
In diesem Bereich benötige ich jetzt allerdings auch Dateien zum Download. Diese sollen natürlich nicht einfach über eine URL erreichbar sein, sondern geschützt sein.
Grundsätzlich habe ich dazu 2 Möglichkeiten gefunden:
- Verschlüsselung eines Verzeichnisses mit .htaccess und anschließende Übergabe über URL http://user:password@muster.de). Das habe ich dann auch versucht, allerdings hat die Übergabe mit einem Link nicht funktioniert und das sichtbare Passwort in der URL ist auch nicht ganz vorteilhaft...
- Ablage der Dateien außerhalb des öffentlichen Verzeichnisses und Zugriff über ein Script. Da weiß ich nur nicht so wirklich, wie ich das machen soll...
Wenn ich die zweite Möglichkeit hinbekomme, tendiere ich zu dieser. Wisst ihr, wie ich das realisieren könnte oder habt ihr noch eine andere Idee?
Danke im Voraus für alle Antworten und ein schönes Wochenende!
pst0042
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").
- wieso Verschlüsselung?
- 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 )...
- 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...
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.
Ok und wie soll ich das dann am besten umsetzen?
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...
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
- du meinst durch die Benutzung eines bestimmten Browers (namentlich: Chrome) wird die URL-Verschlüsselung des HTTPS teilweise ausgehebelt?
- das wäre ja skandalös und ein Grund es nicht zu verwenden...
- „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...
- geschnallt?
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.
- du meinst, dass HTTPS die URLs, die an den Server übertragen werden, nicht verschlüsselt?
- das, was du über „security by obscurity“ schreibst, ist hoffnungslos falsch...
- 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...
- du solltest auch mal eine konzise Definition des Begiffs „security by obscurity“ aufschreiben... grins
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?
- manno!
- der Unterschied ist, dass die URL so wie ein Passwort schwer zu erraten ist...
- „2020-02-28.log“ ist vergleichsweise leicht zu erraten...
- deine These, dass jeder WWW-Browser die URLs öffentlich zugänglich macht, ist hoffentlich falsch...
- 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...
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
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.
- öhm!?
- 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...)...
- 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?
das ist ja was ganz anderes (keine /robots.txt file...)
Du meinst also, man sollte das Konzept der "geheimen" Adressse dadurch perfektionieren, dass man in der robots.txt angibt, Google möge die Seite http://www.example.org/a6JY6929R7CZcg.pdf bitte nicht indexieren?
Oder wie sonst soll verhindert werden, dass die Seite http://www.example.org/a6JY6929R7CZcg.pdf im Google-Index auftaucht?
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...
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
- das Verzeichnis kann na klar auch nich gelistet werden... :)
- ich verstehe nicht, wie deiner Meinung nach die URL, die ich dir bspw. per eMail schicke, „publiziert“ werden soll..
- meinst du jetzt auch noch, dass private eMails ausgewertet und zumindest teilweise veröffentlicht werden?
- 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
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?
- PGP ist nicht erweislich sicher... das kann man höchstens vermuten...
- 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?
- 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...
- huh? wassn? LOL
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.
- nö...
- du erklärst nix...
- 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...
- 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
Mit einem header() komme ich ja aber auch nicht auf nicht öffentliche Verzeichnisse eines Webservers, oder?
Dann änder den header eben wie folgt:
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="downloadName.pdf"');
readfile('originalName.pdf');
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?