matsch333: Zugriffs-Schutz für Video-Dateien (htaccess)

Moin,
ich hab ein simples PHP-Script, das nach Passworteingabe Videos in einem HTML5-player anzeigt. Funktioniert.

Problem:
Die Video-Dateien sollen vor Zugriff durch deren URL geschützt werden. Dazu hab eine htaccess (Deny from all) in den Video-Ordner gelegt. Funktioniert soweit.

Allerdings kann auch das Script die Dinger jetzt nicht mehr anzeigen.
Eigentlich müsste der Server die Videos doch ausliefern, wenn der Zugriff über ein Script erfolgt..?
Hat jemand ne Idee wie ich die Dateien schützen kann und sie trotzdem vom Script gelesen werden?

Merci vielfalt

  1. Tach!

    Die Video-Dateien sollen vor Zugriff durch deren URL geschützt werden.

    Sie würden auch geschützt sein, wenn sie keine URL hätten, sprich: nicht innerhalb des DocumentRoot lägen. Bei ordentlichen Hostern kann man alle Domains (DocumentRoots) auf Unterverzeichnisse des eigenen Kundenverzeichnisses zeigen lassen und hat dann "daneben" genügend Platz für nicht direkt auszuliefernde Dateien.

    Dazu hab eine htaccess (Deny from all) in den Video-Ordner gelegt. Funktioniert soweit.
    Allerdings kann auch das Script die Dinger jetzt nicht mehr anzeigen.

    Dan hast du was falsch gemacht. Beispielsweise greift dein Script nicht über das Dateisystem sondern über eine URL zu, was nicht sehr sinnvoll wäre.

    Eigentlich müsste der Server die Videos doch ausliefern, wenn der Zugriff über ein Script erfolgt..?

    Script oder nicht Script ist nicht das Kriterium. Der Server liefert bei einem Script-Zugriff das aus, was ihm das Script als Ergebnis erzählt. Das Script muss auf Dateisystemebene auf die Dateien zugreifen können.

    dedlfix.

  2. Hi,

    ich hab ein simples PHP-Script, das nach Passworteingabe Videos in einem HTML5-player anzeigt. Funktioniert.

    Heißt genau – was ist „geschützt”?

    Der Zugriff auf die Seite, die den Player enthält?
    Oder die Videos selber?

    Die Video-Dateien sollen vor Zugriff durch deren URL geschützt werden. Dazu hab eine htaccess (Deny from all) in den Video-Ordner gelegt. Funktioniert soweit.

    Das heißt, über HTTP kommt niemand mehr ran.

    Allerdings kann auch das Script die Dinger jetzt nicht mehr anzeigen.

    Und wie macht das Script das?

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  3. Hi,

    Die Video-Dateien sollen vor Zugriff durch deren URL geschützt werden. Dazu hab eine htaccess (Deny from all) in den Video-Ordner gelegt. Funktioniert soweit.

    Allerdings kann auch das Script die Dinger jetzt nicht mehr anzeigen.

    Das Script fordert das Video auch gar nicht an.
    Das Script erzeugt den HTML-Code für einen Video-Player, und der bekommt die URL als Parameter.

    Die Anforderung, das Video vom Server zu laden, kommt dann von dem Video-Player (also im Endeffekt vom Browser).

    Hat jemand ne Idee wie ich die Dateien schützen kann und sie trotzdem vom Script gelesen werden?

    Dazu müßte entweder die Anforderung des Videos vom Script kommen (was nicht funktioniert, schließlich braucht ja der Browser das Video, nicht das Script), oder aber die Auslieferung des Videos erfolgt über ein Script.

    Du änderst also die dem Video-Player übergebene URL auf eine URL, hinter der sich Dein (noch zu schreibendes) Video-Auslieferungs-Script versteckt.

    Das Script kann dann prüfen, ob der Client berechtigt ist (weil er sich in der Session schon mit Paßwort angemeldet hat), und abhängig davon dann das Video (Achtung: passenden Content-Type setzen) ausliefern oder dieses eben verweigern.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  4. Hi + vielen Dank!
    Die Video-Dateien außerhalb des DocRoots zu lagern wär natürlich die geschmeidigste Lösung,
    aber das haut angeblich beim Hosting-Paket des Kunden (is bei 1&1) nicht hin.

    Die Videos selbst sollen geschützt sein, das Script ist per Login geschützt.
    Es geht also darum, dass die Filmchen nur über das Script und nicht per URL aufgerufen werden können (z.B: www.foo.de/videos/001.mp4)

    Das Script macht im Prinzip das Folgende:
    Anzuzeigende Video-Datei wird per GET übergeben (player?v=001)
    (User/Passwort, Ablaufdatum, bla.. wird am Anfang in der Klasse abgefackelt, spielt hier keine Rolle)

    Dann wird das Ding ganz einfach im HTML5-Player angezeigt:

      
    <video>  
        <source src='videos/<?= $_GET["v"] ?>.mp4'    type='video/mp4'>  
        <source src='videos/<?= $_GET["v"] ?>.ogg'    type='video/ogg'>  
        <source src='videos/<?= $_GET["v"] ?>.webm'   type='video/webm'>  
    </video>  
    
    

    @MudGuard
    Hmm, ich kapier nich ganz, was du mit "Video-Auslieferungs-Script" meinst.
    Wie gesagt, Passwort wird eh schon abgefragt.

    1. Hi,

      Es geht also darum, dass die Filmchen nur über das Script und nicht per URL aufgerufen werden können (z.B: www.foo.de/videos/001.mp4)

      Ja werden sie denn „über das Script” aufgerufen?

      Anzuzeigende Video-Datei wird per GET übergeben (player?v=001)
      (User/Passwort, Ablaufdatum, bla.. wird am Anfang in der Klasse abgefackelt, spielt hier keine Rolle)

      Dann wird das Ding ganz einfach im HTML5-Player angezeigt:

      <video>
          <source src='videos/<?= $_GET["v"] ?>.mp4'    type='video/mp4'>
          <source src='videos/<?= $_GET["v"] ?>.ogg'    type='video/ogg'>
          <source src='videos/<?= $_GET["v"] ?>.webm'   type='video/webm'>
      </video>

        
      Also schreibst du ganz einfach die Adressen des Videos da rein, und dann versucht der Client sie anzufordern – über HTTP natürlich. Aber Zugriff über HTTP hattest du doch verboten …  
        
      Mach dir erst mal klar, wie das ganze abläuft – nur, weil du \*per\* Script die Adresse irgendwo ins HTML schreibst, wird diese dann trotzdem nicht „über” das Script angefordert!  
        
      MfG ChrisB  
        
      
      -- 
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      
    2. Tach!

      Die Video-Dateien außerhalb des DocRoots zu lagern wär natürlich die geschmeidigste Lösung,
      aber das haut angeblich beim Hosting-Paket des Kunden (is bei 1&1) nicht hin.

      Dann lass bitte nochmal genau hinschauen, ob man bei der Domainverwaltung nicht doch ein Unterverzeichnis anstatt nur / angeben kann. Bei Paketen mit PHP hat man normalerweise die Möglichkeit, mehrere Domains zu erwerben. Diese muss man sinnvollerweise auf (separate) Unterverzeichnisse zeigen lassen können. Das geht bei 1&1 generell und es würde mich sehr wundern, wenn das in dem Paket nicht ginge.

      Die Videos selbst sollen geschützt sein, das Script ist per Login geschützt.
      Es geht also darum, dass die Filmchen nur über das Script und nicht per URL aufgerufen werden können (z.B: www.foo.de/videos/001.mp4)

      Soweit haben wir das schon verstanden.

      Das Script macht im Prinzip das Folgende:
      Anzuzeigende Video-Datei wird per GET übergeben (player?v=001)
      (User/Passwort, Ablaufdatum, bla.. wird am Anfang in der Klasse abgefackelt, spielt hier keine Rolle)

      Dann wird das Ding ganz einfach im HTML5-Player angezeigt:

      <video>
          <source src='videos/<?= $_GET["v"] ?>.mp4'    type='video/mp4'>
          <source src='videos/<?= $_GET["v"] ?>.ogg'    type='video/ogg'>
          <source src='videos/<?= $_GET["v"] ?>.webm'   type='video/webm'>
      </video>

        
      Du sagst also dem Browser, dass er sich die Videos unter den angegebenen URLs abholen soll. Soweit so üblich. Hast du nun auch dafür gesorgt, dass diese Aufrufe nicht direkt auf eine Datei losgehen sondern an ein Script, das nun zum Beispiel per Session-Eintrag feststellt, dass der Zugriff berechtigt ist und nun mit readfile() oder ähnlichem seinerseits auf die Datei zugreift und sie an den Browser durchreicht (und vorher noch passende Content-Type-Header setzt)?  
        
      Wenn man es nicht zu kompliziert (mit mod\_rewrite) machen möchte, gibt man dem Browser URLs der Form download.php?v=name  
        
      
      > Hmm, ich kapier nich ganz, was du mit "Video-Auslieferungs-Script" meinst.  
        
      Genau das tut nämlich ein Video-Auslieferungs-Script. Es reicht nicht, ein Passwort abzufragen und dann den Browser direkt zugreifen zu lassen, denn direkte Zugriffe sollen ja verhindert werden, was ja auch schon klappt.  
        
      Vorgehensweise in Kurzform:  
      - Nutzer kommt auf Seite und kann ein Video aussuchen.  
      - über Formular oder Link kommt das Zugangsprüf-Script an die Reihe und fragt nach der Berechtigung.  
      - Berechtigungsdaten werden ausgewertet und in einer Session ein OK abgelegt.  
      - Antwortseite enthält den Player oder das HTML5-Video-Element. Die URLs zeigen auf das Download-Script  
      - Download-Script prüft in der Session die Berechtigung, sendet die Content-Type-Header und reicht das Video durch. Ohne Berechtigung muss es auch ein Video ausgeben, denn das erwartet der Browser üblicherweise, der Inhalt ist aber ein "Nicht berechtigt".  
        
        
      dedlfix.