2008-11-13 8 views
6

Was ist der beste Weg zum Passwort schützen Quicktime-Streaming-Videos mit PHP /. Htaccess. Sie werden mit rtsp gestreamt, aber ich kann bei Bedarf andere Formate verwenden.Wie man passwortgeschützte streaming videos mit php

Ich weiß, wie Authentifizierung mit PHP zu tun, aber ich bin mir nicht sicher, wie Sie Authentifizierung einrichten, so dass die Streaming-Dateien URLs schützt, so dass ein Benutzer kann nicht einfach kopieren und teilen Sie die URL.

Oder überschätze ich das und kann einfach ein normales Authentifizierungsschema verwenden und die Dateien in ein geschütztes Verzeichnis stellen?

Antwort

0

Zunächst einmal ist es sehr einfach, einen Referer zu fälschen. Diese Informationen werden im Browser des Benutzers gespeichert, so dass ein Benutzer einfach in den Server telnet und seinen eigenen Referer zur Verfügung stellen kann, der zu Ihrer Domain passt.

Ein paar Dinge, die Sie könnten versuchen:

Zuerst sicherer, aber immer noch fälschbare. mod_rewrite bietet die Möglichkeit, Cookies zu überprüfen. Was Sie tun könnten, ist ein Cookie zu setzen, wenn der Benutzer Ihre Website besucht, die einige obskure Daten enthält. Dann könnten Sie Ihre RerwriteCond zu so etwas wie dies ändern:

RewriteEngine On 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_COOKIE} obscurename=obscurevalue [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC] 
RewriteRule \.(asx¦ASX)$ http://www.yourdomain.com/images/leech.gif [R,L] 

Eine andere, bessere Technik würde bedeuten, mit PHP und Mime-Typen arbeiten. Ich bin mir nicht sicher, in welchem ​​Umfang dies Streaming-Inhalte unterstützen würde, aber ich gehe davon aus, dass es funktionieren wird. Was Sie tun können, ist, dass alle Ihre Video-Links auf eine .php-Datei zeigen (die Abfrage-Zeichenfolge bestimmt, welches Video ausgewählt wurde). Dann, wenn ein Benutzer auf diesen Link zu besuchen versucht, tun Sie so etwas wie so:

<?php 
    // You could also check some sort of session variable 
    // that is set when the user visits another part of your 
    // site 
    if(!isLoggedIn()){ 
     header("Location: errorPage.htm"); 
     exit; 
    }else{ 
     // Get the name of the file specified 
     $file = get_file_name($_GET['fileID']); 

     // Specify the proper mime-type for the data you're sending 
     // (this may have to change, depending on your situation) 
     header("Content-type: video/vnd.rn-realvideo"); 

     // Read the file and output it to the browser 
     readfile($file); 
    } 
?> 

Von dem, was ich gelesen habe, die meisten Server kennen, die Mime-Typen Mime-Typen sind Streaming, so sollte der Browser Abbildung der Lage sein, heraus, wie man mit der Streaming-Datei richtig umgehen kann.

+1

Die zweite Lösung funktioniert und ist sicher. Es ist jedoch keine gute Idee, große Dateien (Video) über php zu übergeben. – Jacco

1

Versuchen Sie, Amazon S3-Dienst zu verwenden, es hat Macken, aber es macht Sinn, sobald Sie sich damit vertraut machen.

Es gibt Haken in ihrer API, um zeitlich URLs zu erreichen, die für spezifizierte Zeit aktiv sind, also können Sie URL dem Besucher frei zeigen, weil es nicht 10 Minuten oder später arbeitet.

Es ist fast trivial mit php zu tun (ca. 15 Zeilen Code), es gibt eine Menge Beispiele in ihren Foren, so dass Sie nicht von Grund auf neu gehen und vollständige Dokumentation darüber lesen müssen, wie dies zu erreichen ist.

Welche Art von Autorisierung werden Sie vornehmen, bevor Sie Links generieren und anzeigen, die Ihnen überlassen sind.

Sie können auch sehen, wie es von Ihrer Domain wie video.yourdomain.com anstelle von Standard-s3-URLs serviert wird.

Die letzte Sache, es ist billig - wir zahlten um 2 US $ für den Monat des Testens und der Bereitstellung, wenn ich 8 GB hochlädte und es 3 Mal vollständig herunterlud und den Download für ungefähr 100 Mal initialisierte. Die Person, für die ich das gemacht habe, ist vom Preis so zufrieden, dass er alle seine herunterladbaren Medien nach s3 verschieben möchte.

Nun lesen Sie alles, was ich geschrieben habe sieht es wie kommerzielle/Spam, aber ich bin so zufrieden mit dem Service, weil ich alles für Audio-Dateien früher codiert, und es dauerte Tage, bis alles gut funktionierte und dies dauerte ein paar Stunden implementieren (meist mit dem Service vertraut werden).

3

Beide Webserver nginx und lighttpd haben X-Send-File-Header, die Sie von PHP zurückgeben können.Sie können also Ihre Prüfungen in PHP durchführen und dann die Datei bedingt abspeichern.

if (check_user_can_access()){ 
    header('X-sendfile: /path/to/file'); 
} else { 
    header('HTTP/1.1 403 Fail!'); 
} 

Lighttpd hat auch eine ordentliche Modul mod_secure_download genannt, die Sie programmatisch ermöglicht eine URL zu generieren, die nur für einen kurzen Zeitraum gültig ist.

Mit Nginx und möglicherweise lighttpd können Sie die Download-Geschwindigkeit begrenzen, sodass Sie Streaming-Daten nicht schneller senden, als sie verbraucht werden können.

In beiden Fällen möchten Sie Ihren Webserver für die Bereitstellung von Dateien verwenden. Serving sie über PHP ist möglich, aber langsam.

+1

Beste Empfehlung hier. Ich auch, dass Sie ein Modul für Ihr httpd verwenden. Viel einfacher als eine vollständige Abstraktion in Ihrer App zu programmieren. – Till

+0

Ich habe Probleme, wenn ich eine Suchoperation durchführe. Irgendwelche Hinweise darauf, wie ich mit dieser Methode eine Suche durchführen könnte? – sj7

1

Sie vielleicht einen Blick auf nehmen möchten: Sie mod_xsendfile (for apache)

Es ermöglicht intern in eine Datei umleiten.

So könnten Sie Ihre Download-Link zu checkCredentials.php

<?php 
if (isAuthorised($_POST['user'], $_POST['pass'])) { 
    header("X-Sendfile: $somefile"); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Disposition: attachment; file=\"$somefile\""); 
    exit(0); 
} else { 
    show403('bad credentials'); 
} 
?> 

Dieses Modul Punkt ist auch für andere Web-Servern zur Verfügung. Wenn ich mich richtig erinnere, kommt die Idee ursprünglich von lighttpd, aber - wie Josh sagt - auch für nginx verfügbar.

1

In Jaccos Lösung ist es möglich, die Header zu überprüfen, die URL für die Datei zu finden und sie ohne Authentifizierung herunterzuladen?

Eine mögliche Lösung, die ich denken könnte, wäre, die Dateien somplace, die für jeden außer dem Browser zugänglich ist, d. H. Mit einem .htaccess alles zu verweigern. Funktioniert das?

+1

Nein, ist es nicht. Der X-Sendfile-Header wird entfernt, die Datei scheint sich am angeforderten Speicherort zu befinden. Darüber hinaus kann x-sendfile Dateien lesen, die normalerweise nicht über das Internet zugänglich sind – Jacco