Ergebnis 1 bis 17 von 17

Thema: Geschützte Videos nach Login abspielen

  1. #1
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Frage Geschützte Videos nach Login abspielen

    Hallo,

    ich habe einen passwort geschützten Bereich und per htaccess geschützte Videos, die für eingeloggte Mitglieder angezeigt werden sollen. Dazu habe ich Contao um ein spezielles Inhaltselement "Protected Video" erweitert, das quasi eine Mischung zwischen "Audio/Video" und "Downloads" ist, so dass die Berechtigung geprüft wird, bevor die Datei an den Player weiter geleitet wird.

    Das funktioniert in den meisten Browsern, aber z.B. bei iOS / Safari wird das Video nicht geladen.

    Hat jemand schon einmal etwas ähnliches gemacht und kann mir einen Tipp geben? (MIME-Types sind im htaccess ja schon standardmäßig eingetragen)

    Danke und Grüße,
    juju

    PS: Es ist Contao Version 3.2.20 im Einsatz

  2. #2
    Contao-Nutzer
    Registriert seit
    20.11.2013.
    Beiträge
    202

    Standard

    Hallo juju,

    evtl. macht dir hier der Codec ein Strich durch die Rechnung. Hast du mal versucht ein anderes Format zu nutzen bzw. unterschiedliche Formate anzubieten?

    Viele Grüße
    hippo

  3. #3
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Hallo hippo,

    danke für Deine Antwort. Der verwendete codec ist h.264 - ohne den Verzeichnisschutz der Dateien per .htaccess laufen die Videos ja auch im Safari. Nur mit dem Aufruf über
    Code:
    geschuetzteseite.html?file=files/geschuetzte-videos/video.mp4
    scheint Safari (und vielleicht auch ungetestete Exotenbrowser) Probleme zu haben. Auch eine Umleitung per .htaccess, um Safari eine Datei "vorzugaukeln" hat nichts gebracht.

    Bzgl. verschiedener Formate möchte ich das dem Redakteur nicht zumuten für jedes Video 3 Formate erzeugen, hochladen und einbinden zu müssen. Im Normalfall klappt das ja mit mp4/h.264 mit mediaelement.js einwandfrei.

    Freue mich über weitere Hilfe.

    Danke und Grüße,
    juju

  4. #4
    Contao-Nutzer
    Registriert seit
    20.11.2013.
    Beiträge
    202

    Standard

    Zitat Zitat von juju Beitrag anzeigen
    ohne den Verzeichnisschutz der Dateien per .htaccess laufen die Videos ja auch im Safari
    Ah ok - dann kann man das ausschließen.

    Evtl. ein Ansatz: Wenn man die "Ordner schützen" Funktion in Contao verwendet wird verhindert dass der Ordnerinhalt per http übertragen werden kann. Dazu wird im Ordner automatisch eine .htaccess angelegt. Evtl. hilft dir die Struktur dieser Datei weiter zum debuggen. Im Prinzip kann man ja diese direkt übernehemn, eben nur mit einer zusätzlichen Abfrage ob das Mitglied angemeldet ist.

    Viele Grüße
    hippo

  5. #5
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Bin mir nicht sicher, ob ich Deinen Vorschlag verstehe. Schlägst Du vor die .htaccess zu bearbeiten?

    Ich hatte auch das bereits versucht, diese nämlich zu erweitern, sodass die Videos nur bei Aufruf von der im Einsatz befindlichen domain aus "durch gelassen" werden. Beherrsche die Direktiven aber leider noch nicht so sehr und habe es nicht geschafft.

    Danke und Grüße,
    juju

  6. #6
    Contao-Nutzer
    Registriert seit
    20.11.2013.
    Beiträge
    202

    Standard

    Ja, das hattest du schon versucht. Ich dachte evtl. ist es leichter eine funktionierende als Basis zu nehmen, da die automatisch erstellte ja schon macht was du willst, nur dass man ihr die Bedingung beibringen muss wann der Schutz ausgehebelt sein soll.
    Aber was meinst du mit "sodass die Videos nur bei Aufruf von der im Einsatz befindlichen domain aus "durch gelassen" werden". Wenn du einen solchen Link anbietest
    Code:
    geschuetzteseite.html?file=files/geschuetzte-videos/video.mp4
    warum sollte der von anderen Seiten nicht aufrufbar sein? Also mit
    HTML-Code:
    <a href="geschuetzteseite.html?file=files/geschuetzte-videos/video.mp4">Video</a>
    Nochmal zum Anfang: Wolltest du nicht nur Mitglieder zugreifen lassen? Wie überprüfst du ob das Mitglied angemeldet ist, außer offensichtlich mit der URL?

    Viele Grüße
    hippo

  7. #7
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Hallo hippo,

    ich prüfe den Zustand "Eingeloggt" und "Darf zugreifen" per php, sprich über mein Inhaltselement "Protected Video" auf der Seite "geschuetzteseite.html" mit Hilfe der gleichen Funktion wie im Contao Download Inhaltselement.

    In einer .htaccess hab ich ja keine Informationen über Mitgliederstatus oder gewährte Rechte.

    Gruß,
    juju

  8. #8
    Contao-Nutzer
    Registriert seit
    20.11.2013.
    Beiträge
    202

    Standard

    Eine letzte Idee. Hast du das "index.php" in der URL deaktiviert? Wenn nicht sollte dein Link evtl. so lauten
    Code:
    index.php/geschuetzteseite.html?file=files/geschuetzte-videos/video.mp4"
    Viele Grüße
    hippo

  9. #9
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Hallo hippo,

    erstmal danke, dass Du thematisch immernoch bei mir bist :-)

    Bin mir leider wieder nicht sicher, was Du meinst. Meinst Du die URL-Umschreibung? Ja, die ist aktiviert. (geschuetzteseite.html)
    Oder soll ich sie gerade deaktivieren?

    Bist Du der Meinung, dass die Dateiendung Probleme macht? Ich hatte ja wie gesagt auch schon versucht per htaccess-Umleitung den direkten Zugriff auf die geschützte Datei "vorzugaukeln". htaccess auf root-Ebene:
    Code:
    RewriteRule ^protected/(.*)\.mp4 http://www.xyzdomain.de/geschuetzteseite.html?file=files/geschuetzte-videos/$1.mp4 [R=301,L]
    Danke und Grüße,
    juju

  10. #10
    Contao-Nutzer
    Registriert seit
    20.11.2013.
    Beiträge
    202

    Standard

    Hallo juju,

    ja, ich meine die URL-Umschreibung - die kann auch so bleiben. Dass die Dateiendung Probleme macht kann ich mir auch nicht vorstellen.
    Komisch, weiß leider nichts mehr und kann nicht sagen was da gerade der Safari anders macht. Wenn mir noch was einfällt schreib ich natürlich...

    Viele Grüße
    hippo

  11. #11
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Ich glaube ja inzwischen, es liegt an dem generierten Header. Ich habe mich wie gesagt nah am Download-Element orientiert. Der Header, der dort für die Datei, die an den Browser gesendet wird, generiert wird ist folgender (File.php):
    Code:
    /**
    	 * Send the file to the browser
    	 *
    	 * @param string $filename An optional filename
    	 */
    	public function sendToBrowser($filename=null)
    	{
    		// Make sure no output buffer is active
    		// @see http://ch2.php.net/manual/en/function.fpassthru.php#74080
    		while (@ob_end_clean());
    
    		// Prevent session locking (see #2804)
    		session_write_close();
    
    		// Disable zlib.output_compression (see #6717)
    		ini_set('zlib.output_compression', 'Off');
    
    		// Open the "save as …" dialogue
    		header('Content-Type: ' . $this->mime);
    		header('Content-Transfer-Encoding: binary');
    		header('Content-Disposition: attachment; filename="' . ($filename ?: $this->basename) . '"');
    		header('Content-Length: ' . $this->filesize);
    		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    		header('Pragma: public');
    		header('Expires: 0');
    		header('Connection: close');
    
    		// Output the file
    		$resFile = fopen(TL_ROOT . '/' . $this->strFile, 'rb');
    		fpassthru($resFile);
    		fclose($resFile);
    
    		// Stop the script
    		exit;
    	}
    Die Zeile "Content-Disposition" habe ich in meinem Modul bereits auskommentiert, da ja definitiv kein Dialog gewünscht ist. Bei ein/zwei anderen bin ich unsicher. Werde da weiter forschen.

    Viele Grüße,
    juju
    Geändert von juju (30.04.2015 um 13:25 Uhr)

  12. #12
    Contao-Fan Avatar von bibib
    Registriert seit
    19.06.2009.
    Ort
    Linz, Oberösterreich
    Beiträge
    644
    Partner-ID
    8517

    Standard

    Hallo juju,

    eine Antwort auf dein Problem hab ich zwar auch nicht, aber da ich auch gerade einen internen Bereich mit Passwortschutz angelegt habe, in dem Videos abgespielt werden sollen, interessiert mich deine Vorgangsweise. Ist dieses "Protected Video" eine Erweiterung oder was selbst gebasteltes? Google findet nichts zu dem Thema. Wozu benötigt man das, reicht es nicht, das Verzeichnis per .htaccess zu schützen und den Zugriffsschutz auf das Inhaltselement Video/Audio auf die gewünschten Mitgliedergruppen zu beschränken? (Abgesehen davon, dass sich das Video eh schon innerhalb des PW-geschützten Bereiches befindet ...)

    Blicke nicht ganz durch, wäre nett, wenn du mir dazu was sagen könntest
    (und hoffe, dass du dein Problem inzwischen lösen konntest)

    Grüße, bibib

  13. #13
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Hallo bibib,

    die Erweiterung "Protected Video" ist eine Eigenentwicklung vom mir.

    Du wirst die Videos out-of-the-box nicht zum Laufen bekommen, da Du sie ja per htaccess geschützt hast. Somit ist die normale Anzeige im Frontend unterbunden. Nur das Download-Element funktioniert out-of-the-box, da dort der Status des Benutzers getestet wird, um dann zu entscheiden, ob die Datei an den Browser gesendet werden darf oder nicht. Den htaccess-Schutz kannst Du also nur per PHP-script wie in diesem Fall umgehen (daher meine Erweiterung).

    Alternative wäre, die Videos nicht zu schützen, sondern nur die sie enthaltenden Contao-Inhalselemente. Hängt vom Anspruch des Kunden bzw. davon ab, wie kritisch die Inhalte sind.

    Viele Grüße,
    juju

  14. #14
    Contao-Fan Avatar von bibib
    Registriert seit
    19.06.2009.
    Ort
    Linz, Oberösterreich
    Beiträge
    644
    Partner-ID
    8517

    Standard

    Hallo juju,

    ach du ...
    Das war mir nicht klar, na super. Die Videos müssen schon geschützt werden, Inhaltselement alleine reicht nicht. Jetzt hab ich wohl ein Problem.

    Ich frag jetzt mal ganz direkt, würdest du deine Erweiterung denn in irgendeiner Form zur Verfügung stellen, wenn sie (auch für Contao 3.4) funktioniert? Natürlich gerne mit finanzieller Beteiligung, ich habe keine Ahnung vom Aufwand.

    Grüße, bibib

    *****************************************
    Edit:
    Wie ist das eigentlich: 100%igen Schutz gibt's ja nie. Angenommen, diese Erweiterung funktioniert, die Videos sind per .htaccess vor direktem Zugriff geschützt und abspielbar - funktioniert dann sowas wie *klick* trotzdem? Nur ein Beispiel, es gibt ja sicher Möglichkeiten wie Sand am Meer. Video mitschneiden, Tonspur aufnehmen etc. - wo ein Wille, da ein Weg ...
    Geändert von bibib (04.05.2015 um 11:58 Uhr)

  15. #15
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Hallo Bibib,

    das wird mir leider langsam zu sehr zu Deinem Thema - schließlich erhoffe ich mir ja noch Antworten auf mein Problem.

    Wenn Du mich kontaktieren möchtest, dann mach das doch bitte per pm (Private Nachricht hier im Forum). Wenn Du generelle Fragen zum Dateischutz hast, dann mach doch bitte einen eigenen Beitrag auf.

    Und nun wieder an alle: Falls mir jemand mit meinem Problem helfen kann würde ich mich weiterhin über Hilfe oder Hinweise freuen.

    Danke & Grüße,
    juju

  16. #16
    Contao-Fan Avatar von izanagi
    Registriert seit
    19.01.2011.
    Ort
    Köln
    Beiträge
    595

    Standard

    Schade ich hatte gehofft hier eine Lösung zu finden
    Bisher habe ich nur folgendes hinbekommen:
    Direktaufruf des Videos per htaccess via Format mp4,mpg,m4v zu unterbinden.
    Dann sind diese nur noch lokal innerhalb Contao erreichbar. Diese wiederum über die Mitgliedergruppen sperren, regulieren.
    Erweiterungen [district_settings] [district_cloud3d] [district_rating]
    Design,Web,Videos und Games - mediadistrict.de

  17. #17
    Contao-Nutzer
    Registriert seit
    22.02.2017.
    Beiträge
    1

    Standard Geschütztes Streaming

    Moin,

    der Hinweis auf die File.php ist richtig - ein wesentliches Problem für das Streaming ist, dass die oben genannte Funktion kein Byte-Serving kann (HTTP-Range-Requests).

    Was die File.php offenbar kann ist, die Benutzerberechtigung überprüfen. Ich habe sie daher als Ausgangspunkt für eine geschützte Streaming-Möglichkeit verwendet:

    PHP-Code:
        /**
         * Send the file to the browser
         *
         * @param string $filename An optional filename
         */
        
    public function sendToBrowser($filename=null)
        {
            
    // Make sure no output buffer is active
            // @see http://ch2.php.net/manual/en/function.fpassthru.php#74080
            
    while (@ob_end_clean());

            
    // Prevent session locking (see #2804)
            
    session_write_close();

            
    // Disable zlib.output_compression (see #6717)
            
    ini_set('zlib.output_compression''Off');
            
            
    // START ADDED BY HN
            
    if(strpos($this->mime,"mp4")!==FALSE && isset($_GET["stream"])){
                
    $this->sendVideoStream();
                return;
            }
            
    //END ADDED BY HN

            // Open the "save as …" dialogue
            
    header('Content-Type: ' $this->mime);
            
    header('Content-Transfer-Encoding: binary');
            
    header('Content-Disposition: attachment; filename="' . ($filename ?: $this->basename) . '"');
            
    header('Content-Length: ' $this->filesize);
            
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            
    header('Pragma: public');
            
    header('Expires: 0');
            
    header('Connection: close');

            
    // Output the file
            
    $resFile fopen(TL_ROOT '/' $this->strFile'rb');
            
    fpassthru($resFile);
            
    fclose($resFile);

            
    // Stop the script
            
    exit;
        }
        
        
    //START ADDED BY HN
        
    protected function sendVideoStream(){
            
    $path TL_ROOT '/' $this->strFile;
            
    $videostream = new VideoStream($path);
            
    $videostream->start();
            exit();
        }
        
    //END ADDED BY HN 
    Die Methode sendVideoStream verwendet die Klasse VideoStream. Die Klasse kann man am einfachsten direkt unten in die File.php mit rein kopieren (Wobei es vermutlich "sauberer" wäre, die Klasse ordentlich im Autoload abzulegen).


    Das Streaming kann dann über die Download-URL genutzt werden, wenn der GET-Parameter "stream" mit angehängt wird, also etwa so:
    Code:
    index.php/geschuetzteseite.html?file=files/geschuetzte-videos/video.mp4&stream
    Die genauen Bedingungen, wann eine Datei zum Stream und wann zum DL angeboten wird, können in der Zeile
    PHP-Code:
    if(strpos($this->mime,"mp4")!==FALSE && isset($_GET["stream"])){ 
    festgelegt werden. Hier wird geprüft, ob der Parameter "stream" existiert und die Datei ein mp4-Mime hat.


    Mit dieser Methode kann ein eingeloggter Benutzer die Datei genau dann streamen, wenn er sie auch herunterladen dürfte.

    Um das Video auf einer Inhaltsseite einzubinden, kann man entweder als HTML-Element den Video-Tag selber schreiben mit der genannten URL oder das Template ce_player editieren. Ich habe letzteres getan und das Template wie folgt angepasst:
    PHP-Code:
    <?php $this->extend('block_searchable'); ?>

    <?php $this->block('content'); ?>

      <!-- indexer::stop -->
      <?php if ($this->isVideo): ?>
        <video<?= $this->size ?><?php if ($this->poster): ?> poster="<?= $this->poster ?>" preload="none"<?php endif; ?><?php if ($this->autoplay): ?> autoplay<?php endif; ?> controls>
          <?php foreach ($this->files as $file): ?>
            <source type="<?= $file->mime ?>" src="<?= $this->Environment->requestUri ?>?stream=true&file=<?= $file->path ?>" title="<?= $file->title ?>">
          <?php endforeach; ?>
        </video>
      <?php else: ?>
        <audio<?= $this->size ?> preload="none"<?php if ($this->autoplay): ?> autoplay<?php endif; ?> controls>
          <?php foreach ($this->files as $file): ?>
            <source type="<?= $file->mime ?>" src="<?= $file->path ?>" title="<?= $file->title ?>">
          <?php endforeach; ?>
        </audio>
      <?php endif; ?>
      <!-- indexer::continue -->

    <?php $this->endblock(); ?>

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •