Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Symlinks für Downloads, Zugriff von außen, Kontrolle über Downloads

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Symlinks für Downloads, Zugriff von außen, Kontrolle über Downloads

    Hallo,

    ich nutze aktuell ein PHP-Script, welches sämtliche Videodateien öffnet/liest und per Header an den Benutzer sendet.

    Diese Methode kann ich nicht länger anbieten, da Videos in einem Player gestreamt werden sollen und dieser eigentlich nur einen Direktzugriff per http unterstützt (die aktuelle Methode führt zu Fehlern des Players, z.B. kein Suchen möglich, verzögerter Start erst nach Laden des kompletten Files, Bedienung tlw. nicht möglich).

    Es ist wichtig, dass die Dateien nicht per Direktzugriff abrufbar sind. Ich MUSS vor dem Zugriff auf die Dateien per PHP Prüfungen durchführen (z.B. ob ein Benutzer das Video überhaupt sehen darf, ob das Video gesperrt wurde und somit eine Auslieferung der Datei verhindert werden muss).

    Ich möchte es nun mit Symlinks versuchen - aber wie setze ich das um?
    Ich habe z.B. über 1000 einzelne Videodateien, wenn ein Benutzer bspw. gesperrt ist, soll er nicht an die Datei kommen. Wenn ich aber den htaccess-Verzeichnisschutz entferne und die Datei somit nicht mehr per PHP ausliefern brauche, kann der User auch, wenn er zwar sonst keine Aktionen mehr durchführen kann, über den Direktlink an die Datei kommen.

    Gruß

  • #2
    Du leitest deinen Download immer auf eine PHP-Datei weiter. Hier entscheidest du ob der Benutzer das Video sehen darf oder nicht. Ausliefern kannst du die Datei dann mit readfile().

    Was dir wohl fehlt ist das teilweise auslesen des Files, vllt. hilft dir das weiter:

    http://php.net/manual/de/function.readfile.php -> Suchen:HTTPRange
    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

    Kommentar


    • #3
      Hallo,

      danke für Deine Antwort.

      Wenn ich Dich richtig verstanden habe, ist das doch genau die Methode, die ich aktuell habe. Und eben das geht nicht, weil der Videoplayer nicht mit durch PHP ausgegebenen Dateien umgehen kann, laut Support:
      You _must_ use byte-range request http delivery. You're using a file-attach content delivery which will not allow seeking.
      Oder ist das readfile() etwas anderes als das, was ich aktuell nutze:

      Code:
      $fsize = filesize($file);
      header('Content-Disposition: attachment; filename='.$file.'');
      header('Content-Type: video/mp4');
      header('Content-Length: ' . $fsize);
      $file = fopen($file, 'rb');
      print (fread($file, $fsize));
      Danke.

      Kommentar


      • #4
        Sofern du Einfluss auf die Konfiguration des Servers nehmen kannst, wird eines der folgenden Module für die jeweiligen Webserver die bessere Lösung sein. Bei allen musst du über PHP ein entsprechendes Token für die Authentifizierung in der Url mit ausliefern, damit der Webserver prüfen kann ob der Client berechtigt ist, die Daten abzurufen.

        mod_auth_token für Apache

        HttpSecureDownload für nginx

        mod_secdownload für Lighttpd

        Kommentar


        • #5
          Danke für den Link (für Apache). Das war mir bisher nicht bekannt.
          Und in den beiden ersten Absätzen leuchten mir bereits die folgenden zwei Dinge entgegen:
          also it allows you to protect very large files that can't be piped trough a script languages due to memory limitation.
          Ok, ich kann meine Limits bis ans Hardlimit setzen, dann funktioniert das, aber ist denke ich nicht so gut für die Performance. Teilweise biete ich Dateien größer als 1 GB an.

          Various commercial and video sharing sites are running mod_auth_token module
          Na bitte, dann bietet sich das ja geradezu für mich an.

          Werde es mir heute mal näher anschauen und hoffen, dass es funktioniert.

          Danke.

          Kommentar


          • #6
            Habe mod_auth_token nun installiert und in der config-Datei geladen.

            Wenn ich httpd neustarten will, kommt immer "Invalid command 'AuthTokenLimitByIp'", wenn ich dann halt das AuthTokenLimitByIp weglasse, geht es. Habe die aktuellste Version von mod_auth_token installiert (Version: 1.0.5 Release: 2.el6).

            Gruß

            Kommentar


            • #7
              jo und ?
              Zitat von http://idev.ge/how-to-setup-video-on-demand-pseudo-streaming-server-with-apache-and-mod_h264/
              (IP limit available only in 1.0.6 beta, if you install 1.0.5. stable this function will not work).

              Kommentar


              • #8
                Danke für Deinen freundlichen Hinweis. Ich habe nach Invalid command 'AuthTokenLimitByIp' gegoogelt und nichts gefunden.

                Gruß

                Kommentar


                • #9
                  you're welcome.

                  Kommentar


                  • #10
                    Habe nun die neuere Version installiert und bin seit einer halben Stunde am Testen. Ich habe nun eine entsprechende URL generiert, aber unter dem kommt stets "404 not found".

                    Habe dabei an den unterschiedlichsten Stellen in der htaccess/webserver config und im PHP-Script mal ein "/" weggelassen, mal hinzugefügt, da ich anhand des Beispieles auf der verlinkten Seite nicht genau erkennen kann, wie es nun aussehen muss.

                    Code:
                    <Location /var/www/vhosts/xxx.com/httpdocs/home/video-uploads/vids/>
                        AuthTokenSecret       "xxx"
                        AuthTokenPrefix       /vids/
                        AuthTokenTimeout      60
                        AuthTokenLimitByIp    on
                    </Location>
                    
                    // Settings to generate the URI
                    $secret = "xxx";             // Same as AuthTokenSecret
                    $protectedPath = "/vids/";        // Same as AuthTokenPrefix
                    $ipLimitation = true;                 // Same as AuthTokenLimitByIp
                    $hexTime = dechex(time());             // Time in Hexadecimal
                    //$hexTime = dechex(time()+120);         // Link available after 2 minutes      
                    $fileName = "/".$load_video->file_name;    // The file to access
                    
                    
                    // Let's generate the token depending if we set AuthTokenLimitByIp
                    if ($ipLimitation) {
                      $token = md5($secret . $fileName . $hexTime . $_SERVER['REMOTE_ADDR']);
                    }
                    else {
                      $token = md5($secret . $fileName. $hexTime);
                    }
                    
                    // We build the url
                    $url = $protectedPath . $token. "/" . $hexTime . $fileName;
                    Habe wie gesagt etliche Szenarien mit dem / getestet.
                    Zur Info: Das Verzeichnis ../httpdocs/home/video-uploads/vids/ enthält die zu schützenden Inhalte. Eine htaccess darin verbietet den Direktzugriff auf alle Videodateien.
                    Das PHP-Script wird im Verzeichnis ../httpdocs/home/video-uploads/ ausgeführt.

                    Was mache ich falsch? httpd wurde neu gestartet.

                    Danke.

                    Kommentar


                    • #11
                      error 404 steht auch im logfile?
                      bitte anscahuen und überlegen; ich kenne deine pfade ja nicht:
                      http://httpd.apache.org/docs/current....html#location

                      haste du es schon mit dem beispiele in dem verlinkten artikel versucht?

                      und bitte nicht configs und code in einem codeblock ohne erklärung mischen!

                      Kommentar


                      • #12
                        Im Logfile steht: File does not exist ...

                        Ich habe es mal in Directory anstatt Location geändert. Gleiches Probem.

                        Wie gesagt, in dem Artikel steht <Location /downloads/>. Ich habe dies mal mit dem absoluten Pfad versehen, da ich die Einstellung in einer vhost.conf gemacht habe. Meine Verzeichnisse siehe einen Post vorher.

                        Habe nun alles ausprobiert, aber scheinbar erkennt der Apache die Keys in der URL nicht.

                        Kommentar


                        • #13
                          Eintrag aus dem VHost (nicht .htaccess!)

                          Code:
                          <Location /test/>
                              AuthTokenSecret       "foobar"
                              AuthTokenPrefix       /test/
                              AuthTokenTimeout      60  
                          </Location>
                          Das AuthTokenPrefix entspricht dem Pfad aus der Location, dies ist der Pfad aus der Url.

                          Kommentar


                          • #14
                            Hallo,

                            danke für Deine Antwort.

                            Ja, habe es in der httpd.conf, nicht in einer htaccess.

                            Was bedeutet "dies ist der Pfad aus der URL"?

                            Ich habe aktuell folgendes drin:

                            Code:
                            ScriptAlias /vids/ /var/www/vhosts/xxx.com/httpdocs/home/video-uploads/vids/
                            
                            <Directory /vids/>
                                AuthTokenSecret       "secret"
                                AuthTokenPrefix       /vids/
                                AuthTokenTimeout      60
                                AuthTokenLimitByIp    on
                            </Directory>
                            Leider funktioniert auch das nicht.

                            mod_auth_token ist installiert und geladen. Link wird nach dem Beispielschema korrekt erstellt.

                            Gibt es irgendetwas zu beachten, was ich vielleicht übersehen haben könnte bzw. einfach nicht weiß?

                            Gruß

                            Kommentar


                            • #15
                              So, ich bin jetzt schon ein ganzes Stückchen weiter.

                              Code:
                              ScriptAlias /home/video-uploads/vids/ /var/www/vhosts/xxx.com/httpdocs/home/video-uploads/vids/
                              <Location /home/video-uploads/vids/>
                                  AuthTokenSecret       "secret"
                                  AuthTokenPrefix       /home/video-uploads/vids/
                                  AuthTokenTimeout      60
                                  AuthTokenLimitByIp    on
                              </Location>
                              PHP-Code:
                              $protectedPath "/home/video-uploads/vids/"
                              Dies leitet mich beim Aufruf des generierten URI weiter, ich erhalte allerdings einen 500 internal server error. Ich habe aktuell keine .htaccess mehr im Verzeichnis /home/video-uploads/vids/.


                              Der error_log sagt:

                              Code:
                              [error] [client 88.68.xx] Premature end of script headers: xxx.mp4
                              [warn] [client 88.68.xx] mod_auth_token: request from ip 88.68.xx
                              Komisch ist, wenn ich eine .htaccess in dem vids/ - Verzeichnis erstelle mit deny from all oder sowas, kommt ein Forbidden - Fehler (kein 500er mehr), aber sobald ich allow from all mache kommt der 500er... Ich verstehe das nicht.

                              Warum???

                              Edit: Lösung:

                              Alias anstelle von ScriptAlias in der httpd-conf. Dann kommt kein 500er Error mehr und es funktioniert sogar alles...

                              Ich brauche auch gar keine extra htaccess mehr in dem Verzeichnis wo meine Videofiles liegen (ja, die liegen in einem theoretisch öffentlichen Verzeichnis, innerhalb httpdocs), wenn man den Direktlink aufruft kommt Autorisierung fehlgeschlagen.

                              Super.

                              Kommentar

                              Lädt...
                              X