Dateien, Verzeichnis vor direktem Zugriff schützen, Zugfriff nur vom PHP-Script
Hallo,
ich habe eine sehr komplizierte Frage um diese Uhrzeit.
Szenario:
Ein Ordner bzw. dessen Dateien sollen vor einem direkten Zugriff geschützt werden. Es existiert ein PHP-Script, welches aber auf die Dateien zugreifen darf und dementsprechend dem Besucher auch ausliefern soll, nur eben nicht direkt.
Es geht um HLS, wo in einem Ordner .m3u8 wie auch .ts generiert werden, nur soll der direkte Zugriff per URL verhindert werden. Ursprünglich dachte ich am Apache (2.4) mit mindestens Auth Basic, wo die Zugangsdaten im PHP-Script enthalten sind, und sobald das Script aufgerufen wird, werden die Daten auch ausgeliefert. Würde ein Besucher die URL direkt aufrufen, käme der Anmelde-Dialog von Apache.
Unter Apache 2.4 könnte man in der .htaccess einfügen, aber damit klappt die Auslieferung der Dateien auch nicht.
Es geht darum, dass kein unbefugter die Dateien direkt abgreifen kann sondern dass es nur per PHP-Script geht. Das PHP-Script ist so aufgebaut, das im switch/case steht, wie auch #EXTM3Um #EXT-X-VERSION:4, #EXT-X-INDEPENDENT-SEGMENTS usw.. Die Ausgabe klappt damit perfekt und die passende .m3u8 samt ihren .ts-Dateien werden ausgegeben.
Für das komplizierte Szenario möchte ich mich entschuldigen.
Ich für meinen Teil wüsste nicht, wie die generierten Inhalte vor direktem Zugriff geschützt werden können, jedoch vom PHP-Script die Ausgabe ermöglicht werden könnte. Die Medienausgabe selber findet in einem Player statt, da das Script mit vielen Parametern aufgerufen werden muss, damit andere wie auch irgendwelche Crawler oder wer auch immer, nicht direkt zugreifen kann.
Vielen Dank und noch einen schönen Tag.
ich habe eine sehr komplizierte Frage um diese Uhrzeit.
Szenario:
Ein Ordner bzw. dessen Dateien sollen vor einem direkten Zugriff geschützt werden. Es existiert ein PHP-Script, welches aber auf die Dateien zugreifen darf und dementsprechend dem Besucher auch ausliefern soll, nur eben nicht direkt.
Es geht um HLS, wo in einem Ordner .m3u8 wie auch .ts generiert werden, nur soll der direkte Zugriff per URL verhindert werden. Ursprünglich dachte ich am Apache (2.4) mit mindestens Auth Basic, wo die Zugangsdaten im PHP-Script enthalten sind, und sobald das Script aufgerufen wird, werden die Daten auch ausgeliefert. Würde ein Besucher die URL direkt aufrufen, käme der Anmelde-Dialog von Apache.
Unter Apache 2.4 könnte man in der .htaccess
Require all denied
Es geht darum, dass kein unbefugter die Dateien direkt abgreifen kann sondern dass es nur per PHP-Script geht. Das PHP-Script ist so aufgebaut, das im switch/case
header header("Content-type: application/x-mpegURL; charset=utf-8");
Für das komplizierte Szenario möchte ich mich entschuldigen.
Ich für meinen Teil wüsste nicht, wie die generierten Inhalte vor direktem Zugriff geschützt werden können, jedoch vom PHP-Script die Ausgabe ermöglicht werden könnte. Die Medienausgabe selber findet in einem Player statt, da das Script mit vielen Parametern aufgerufen werden muss, damit andere wie auch irgendwelche Crawler oder wer auch immer, nicht direkt zugreifen kann.
Vielen Dank und noch einen schönen Tag.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 61881172382
Url: https://administrator.de/contentid/61881172382
Ausgedruckt am: 21.11.2024 um 19:11 Uhr
6 Kommentare
Neuester Kommentar
Moin,
Du könntest folgendes machen.
Die Dateien liegen nicht "im" Http-Basis-Verzeichnis sondern "darüber" oder "daneben".
Damit sind sie schonmal nicht per http direkt aufrufbar. Dein PHP-Skript kann aber mit file_get_contents darauf zugreifen.
z.B.
/var/www/html für Deien PHP-, HTML-, CSS- und JS-Dateien.
/var/www/data für Deine Daten-Dateien.
Dann verwendest Du ein Session-Login-System und einen GET-Parameter oder URL zum ausliefern der Dateien.
Stefan
Du könntest folgendes machen.
Die Dateien liegen nicht "im" Http-Basis-Verzeichnis sondern "darüber" oder "daneben".
Damit sind sie schonmal nicht per http direkt aufrufbar. Dein PHP-Skript kann aber mit file_get_contents darauf zugreifen.
z.B.
/var/www/html für Deien PHP-, HTML-, CSS- und JS-Dateien.
/var/www/data für Deine Daten-Dateien.
Dann verwendest Du ein Session-Login-System und einen GET-Parameter oder URL zum ausliefern der Dateien.
// Start the session
session_start();
if(!isset($_SESSION['username']))
{
//show login form
die();
}
//deliver data
Stefan
Zusatz.
Mit einer ".htaccess" sagst Du dem Browser, dass jede URL durch Deine index.php laufen soll.
In der prüfst Du die URI, lädst die Daten und gibst diese aus.
Man kann natürlich auch ein https://www.firma.de/deliver.php?file=datei15.pdf ausliefern.
Ich habe mit so etwas eine kleine Bild-Webseite erstellt.
Zuerst kommt der Login und danach kann man die Bilder sehen.
Mit einer ".htaccess" sagst Du dem Browser, dass jede URL durch Deine index.php laufen soll.
In der prüfst Du die URI, lädst die Daten und gibst diese aus.
Man kann natürlich auch ein https://www.firma.de/deliver.php?file=datei15.pdf ausliefern.
DirectoryIndex index.php
RewriteEngine on
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Ich habe mit so etwas eine kleine Bild-Webseite erstellt.
Zuerst kommt der Login und danach kann man die Bilder sehen.
Wie @StefanKittel sagt, PHP kommt über das Dateisystem an die Dateien und nicht über den Webserver, daher diese Dateien über .htaccess verbieten oder, was noch besser ist, eben gleich ausserhalb des wwwroot ablegen.
Da die PHP Dateien erlaubt bleiben sollen, könntest Du über die Dateinamen gehen, und nur die entsprechenden Dateinamen-Erweiterungen verbieten, und das ist, glaube ich, die direkte Antwort auf Deine Frage:
besser ist natürlich eine Whitelist und noch besser, wie @StefanKittel sagt, die Dateien in einem Pfad ausserhalb des wwwroot zu generieren (vielleicht ein eigenes tmp-Verzeichnis). Allerdings würde ich es einfach halten, RewriteRules können verwirrend sein und dann ändert man die später mal und denkt nicht dran, dass da Sicherheit dran hängt, aber das sind Details.
Da die PHP Dateien erlaubt bleiben sollen, könntest Du über die Dateinamen gehen, und nur die entsprechenden Dateinamen-Erweiterungen verbieten, und das ist, glaube ich, die direkte Antwort auf Deine Frage:
<FilesMatch "\.(m3u8|ts)$">
Require all denied
</FilesMatch>
besser ist natürlich eine Whitelist und noch besser, wie @StefanKittel sagt, die Dateien in einem Pfad ausserhalb des wwwroot zu generieren (vielleicht ein eigenes tmp-Verzeichnis). Allerdings würde ich es einfach halten, RewriteRules können verwirrend sein und dann ändert man die später mal und denkt nicht dran, dass da Sicherheit dran hängt, aber das sind Details.
Quote from @PadMan:
Vielen Dank für eure Vorschläge. Die kann ich erst später testen.
Wie erwähnt, sollen auf die generierten HLS-Dateien zugegriffen werden dürfen, aber nur eben dass es vom PHP-Script erlaubt ist.
Die generierten Dateien werden im Temp-Verzeichnis abgelegt, nur dass im Hauptverzeichnis ein verlinkter Ordner sich befindet.
Inwieweit file_get_contents funktionieren könnte, wäre noch eine gute Frage 😉
Das "PHP-Script" ist im Prinzip die "master.m3u8", die sucht für die passende Auflösung die andere .m3u8 raus, die ja generiert wird und die dazu generierten .ts-Dateien werden ja ausgegeben.
Ich probiere mich später mal durch.
Vielen Dank für eure Vorschläge. Die kann ich erst später testen.
Wie erwähnt, sollen auf die generierten HLS-Dateien zugegriffen werden dürfen, aber nur eben dass es vom PHP-Script erlaubt ist.
Die generierten Dateien werden im Temp-Verzeichnis abgelegt, nur dass im Hauptverzeichnis ein verlinkter Ordner sich befindet.
Inwieweit file_get_contents funktionieren könnte, wäre noch eine gute Frage 😉
Das "PHP-Script" ist im Prinzip die "master.m3u8", die sucht für die passende Auflösung die andere .m3u8 raus, die ja generiert wird und die dazu generierten .ts-Dateien werden ja ausgegeben.
Ich probiere mich später mal durch.
mmm... Warum gibt es den verlinkten Ordner, wenn man da gar nicht rankommen soll? Den Vorschlag, den Link dann halt zu löschen, brauch ich Dir nicht geben, da wärst Du ja selbst drauf gekommen
Wenn das PHP Script so heißt, wie eine der Dateien, dann geht das Blocken über Erweiterung natürlich nicht so einfach
file_get_contents liest aus der Datei, also z.b. aus "/tmp/...../...../...m3u8", darauf hat das <FilesMatch "\.(m3u8|ts)$"> vom Webserver keinen Einfluss.