Ankündigung

Einklappen
Keine Ankündigung bisher.

Einbinden von geschützten Audios - readfile wirft nur Zeichensatz aus

Einklappen

Neue Werbung 2019

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

  • Einbinden von geschützten Audios - readfile wirft nur Zeichensatz aus

    Hallo ihr Lieben,

    ich bin seit über einem Monat auf der Suche nach einer Lösung, habe Hilfeseiten durchstöbert, Foren gewälzt und viel getestet, aber ohne Erfolg.
    Ich hoffe, ihr könnt mir helfen und sagen, wo mein Fehler liegt, bevor mein Laptop erleben muss, wie lang die Falldauer aus dem 4. Stock ist.

    Mein Problem:
    Ich möche auf meiner Seite Lieder für Vereinsmitglieder einstellen, die sie sich lediglich anhören können sollen, nicht aber herunterladen oder durch Direktlinks an andere weitergeben.
    Dafür habe ich für alle Mitglieder einen geschützten Bereich erstellt, in dem sie sich mit einem php-Script einloggen können.
    In einem extra Ordner habe ich die Lieder abgelegt und mit .htaccess geschützt:
    Code:
    Order deny,allow
    Deny from all
    Der Direktzugriff ist gesperrt, bis hier hin klappt alles.
    Nun habe ich in der index-Seite, in der die Lieder abgespielt werden sollen (sie wird in einer Hauptseite per include eingebunden), den readfile-Befehl gepackt:
    PHP-Code:
    $file "../sammlungen/testlied.mp3";
       if(
    file_exists($file)) {
           
    header('Content-Type: audio/mpeg');
           
    header('Content-Disposition: inline; file="testlied.mp3"');
           
    header('Content-length: '.filesize($file));
           
    header('Cache-Control: no-cache');
           
    header("Content-Transfer-Encoding: chunked");
       
    readfile($file);
       } 
    Und für den Abspielteil sorgt ein audio-Tag, das mit javascript angesteuert wird (hab ich hier mal weggelassen, das tut ja nichts zur Sache, soweit ich weiß):
    PHP-Code:
    <audio id="song" src="../sammlungen/testlied.mp3" controls preload="none" style="width:100%;"></audio
    Das Ergebnis ist spannend, wenn man Kunstkritiker ist, für ein gutes Weberlebnis aber eher ungeeignet, da es sich nur um einen elendig langen "Text" aus Zeichen handelt, der in etwa so aussieht:
    ID3TXXXmajor_brandmp42TXXXminor_version0TXXXcompat ible_brandsisommp42TSSELavf56.40.101ÿûInfo-0IÈ( !$&)+.0358;=@BEHJMORTWY\^acfiknpsvx{}€ƒ…‡ŠŒ‘”–™œž ¡¤¦©«®±³¶¸º½¿ÂÄÇÊÌÏÒÔ×ÙÜßáäæèëíðòõøúýLavc56.60$IÈ( {,—ÿûdði ¤ 4€„QØ}…¡0 Äq ®™j³“Ìê9nƒâÜšÊêV”ðI4TM5dOT†/IBÈž‚×¢bÁ°¦É˜£4eì1±…LdE"ðС0ØcïÐr‚SÒΛ“ÌŽ”N¹A0 ®^9:1'B0f g Á\š7)ŽKDQxþL38N
    Und das ist nur ein kleiner Ausschnitt, es sind hunderte Zeilen. Am Ende gibt es das Ganze dann nochmal fett und durchgestrichen.

    Wo liegt mein Fehler? Was muss ich ändern?
    Ich bitte euch, keine Antworten wie "informiere dich" (das habe ich ausgiebig getan) oder irgendwelche Links auf mir bekannte Seiten zu schicken, wenn da nicht genau mein Beipiel abgelegt ist, sondern mir entweder idiotensicher zu erklären, wo mein Denkfehler ist oder sogar im besten Falle den korrigierten Code zu schicken.

    So, das war viel Text. Ich danke euch sehr für jede Hilfe, die mich der Lösung nahe bringt.
    Bleibt gesund
    Eure Black Pearl

  • #2
    PHP-Code:
    <audio id="song" src="../sammlungen/testlied.mp3" controls preload="none" style="width:100%;"></audio
    Hier müsste doch der Pfad zu deiner PHP Datei wo das besagte readfile drin steht.

    Nun habe ich in der index-Seite, in der die Lieder abgespielt werden sollen
    Ich denke du brauchst eine eigene Datei mit dem Readfile.
    1) Deine index.php wo du dein HTML ausgibst um die Lieder aufzulisten
    2) Eine PHP Datei womit du deine Datei auslesen kannst.
    3) Solltest du ggf. noch mal schauen ob die Header so korrekt sind. Chunked loading ist meines wissen so, dass der Browser immer nur Teile der Datei lädt. Hier muss dann allerdings das PHP so geschrieben werden, dass es immer nur den Chunk der Datei zurück gibt, welche der Browser angefragt hat. Mit readfile wird aber immer die ganze Datei ausgegeben.

    Kommentar


    • #3
      Zitat von Black Pearl Beitrag anzeigen
      Ich möche auf meiner Seite Lieder für Vereinsmitglieder einstellen, die sie sich lediglich anhören können sollen, nicht aber herunterladen […]
      Vergiss es, das geht nicht, keine Chance. Wenn die Mitglieder die Lieder anhören können sollen müssen sie sie auch runterladen können.

      In einem extra Ordner habe ich die Lieder abgelegt und mit .htaccess geschützt:
      Einfacher wäre gewesen wenn du die Dateien einfach in ein Verzeichnis gelegt hättest das per http nicht erreichbar ist …

      Nun habe ich in der index-Seite, in der die Lieder abgespielt werden sollen (sie wird in einer Hauptseite per include eingebunden), den readfile-Befehl gepackt: […]
      Und für den Abspielteil sorgt ein audio-Tag, das mit javascript angesteuert wird (hab ich hier mal weggelassen, das tut ja nichts zur Sache, soweit ich weiß):
      PHP-Code:
      <audio id="song" src="../sammlungen/testlied.mp3" controls preload="none" style="width:100%;"></audio
      Mal abgesehen davon dass hinter dem readfile noch ein exit stehen sollte damit nicht noch html o.ä. ausgegeben wird (ich kenne den Aufbau deines Codes nicht und weiß nicht ob das wirklich nötig ist): du musst im src-Attribut von audio schon auf das PHP-Script verweisen dass die mp3-Datei ausliefern soll, die Datei selbst ist doch direkt garnicht erreichbar? Und wo genau siehst du den mit »ID3TXXX« beginnenden Zeichensalat?

      Kommentar


      • #4
        Hallo ihr beiden

        Wow, das ging ja schnell. Danke schon einmal, ich glaube, ich checke so gaaaanz langsam, wo der Knoten in meinem Kopf ist.
        Ich versuche mal, es chronologisch zu beantworten.

        @Zeichen32

        Hier müsste doch der Pfad zu deiner PHP Datei wo das besagte readfile drin steht.
        Siehst du, das war mir bislang nicht klar, weil es nirgendwo geschrieben stand. Zumindest nicht auf den Seiten, die ich gefunden habe.

        Solltest du ggf. noch mal schauen ob die Header so korrekt sind. Chunked [...]
        Ich habe von diesen Headern wirklich keine Ahnung, ich habe sie tatsächlich nur übernommen und jeder Versuch, sie zu verstehen, hat mir Kopfschmerzen bereitet. Aber ich werde es wohl mit einem Probe-Abo Aspirin noch einmal versuchen.
        Danke für deine Hilfe.

        @tk1234
        Hmm, das ist natürlich doof. Würde es denn gehen, wenn ich den audio-Teil mit 'display' verstecke und mir selbst einen "player" baue? Mir geht es nicht um die findigen Halbhacker, die kommen eh ran, mir reicht es, wenn die Sportlerinnen mit Normalwissen nicht nur mit dem rechten Mausklick auf "speichern" klicken müssen, um es zu haben. Hast du da einen Trick für mich, außer dem schrecklichen Unterdrücken der rechten Maustaste, wie ich die js-Bastelei mit dem eigenen "Player" elegant umschiffen kann?

        Einfacher wäre gewesen wenn du die Dateien einfach in ein Verzeichnis gelegt hättest das per http nicht erreichbar ist …
        Na das wäre ja sogar noch besser. Nur verstehe ich nicht, wie das im Netz gehen soll. Was ist das für ein Thema, dann belese ich mich gern dazu.

        Und wo genau siehst du den mit »ID3TXXX« beginnenden Zeichensalat?
        Der Zeichensatz wurden mir ganz normal als „html-Text“ auf der sonst normal geladenen Seite angezeigt. Als hätte ich ihn selbst in den Quelltext geschrieben. Er steht also in dem DIV, in dem die Seite mit dem readfile und dem audio-Tag included wurde.

        Mal abgesehen davon dass hinter dem readfile noch ein exit stehen sollte [...] du musst im src-Attribut von audio schon auf das PHP-Script verweisen dass die mp3-Datei ausliefern soll
        Ich glaube, da habt ihr mir beide schon ein ganzes Stück weitergeholfen. Bislang stehen readfile und html-Code ja in einer Datei. Das ist scheinbar falsch, aber das bekomme ich (hoffentlich) hin.
        Preisfrage: Muss die Readfile-Datei im Ordner des Liedes liegen oder kann ich die hinpacken, wo ich möchte?

        Ich danke euch wirklich sehr für eure schnellen Hilfen, ich setze mich gleich mal ran.
        Ganz liebe Grüße
        Eure Black Pearl

        Kommentar


        • #5
          Wenn es dir nur darum geht, das "Speichern unter" auszublenden, dann hatte vor einigen Tagen ein anderer hier die selbe Frage zum Thema Videos:
          https://www.php.de/forum/webentwickl...nload-anbieten

          Code:
          <audio src="test.mp3"  preload="none" controlsList="nodownload" />

          Kommentar


          • #6
            Oh cool, ich danke dir.
            Ich habe es eingebaut, der Menüpunkt ist noch da und abrufbar. Aber ich weiß jetzt, wonach ich suchen muss und habe schonmal 5 Seiten geöffnet, auf denen das ein Thema ist.
            Danke schön

            Kommentar


            • #7
              Hallo ihr lieben Helfer und alle, die sich auch mit diesem Thema herumschlagen.

              Ich freue mich, Erfolg verkünden zu können. Nur dank euch! Und ich bin euch wirklich dankbar.
              Hier ist die Lösung des Problems, die bei mir hervorragend funktioniert ... mit allen Wünschen, die ich hatte.
              Ich hoffe sehr, dass sie auch anderen Nutzern hilft und ich nicht doch noch einen Fehler drin habe.


              1. Die Readfile-Datei:
              PHP-Code:
              <?php
              $file 
              "../sammlungen/testlied.mp3";
                if(
              file_exists($file)) {
                    
              header('Content-Type: audio/mpeg');
                    
              header('Content-Disposition: inline; file="testlied.mp3"');
                    
              header('Content-length: '.filesize($file));
                    
              header('Cache-Control: no-cache');
                    
              header("Content-Transfer-Encoding: chunked");
                
              readfile($file);
              exit;
                }
              ?>
              Wichtig: Der Pfad der $file-Datei muss (zumindest bei mir) vom Speicherort der readfile-Datei aus gesehen werden, nicht vom Ort, an dem es eingebunden wird.
              Zudem darf sich die readfile-Datei nicht im selben Ordner befinden wie die durch .htaccess geschützten Lieder, denn sonst sind auch die php-Dateien dadurch geschützt.
              Ohne exit; funktioniert es zwar, aber sicher ist sicher. Ohne den chunked-header jedoch läuft es bei mir nicht, also bleibt er lieber drin.


              2. Die index.php, in der das Lied laufen soll:
              PHP-Code:
              <audio id="song" src="probe/readfile.php" controls preload="none" style="width:100%;"></audio
              Das war es tatsächlich schon.


              Und jetzt kommt das Bonbon:

              Aus dem Quelltext heraus und auch mit der rechten Maustaste unter dem Punkt "Audio speichern" komme ich nur noch auf die readfile-Datei, der Speicherort des Liedes wird mir dort gar nicht angezeigt.
              Speichere ich das Lied (egal ob über den Pfad der readfile-Datei oder direkt von der Seite), speichert er tatsächlich eine php-Datei ab, in der genau das Zeichenchaos ist, das sich am Anfang auf meine Seite geschlichen hat.
              Speichere ich die mp3-Datei aus den Seiteninformationen heraus (Punkt "Medien" im Mozilla Firefox), speichert er zwar eine mp3, diese ist jedoch nicht abspielbar. Es kommt immer die Meldung, dass ein Fehler aufgetreten sei.
              Das Lied ist also für den Normalnutzer dank .htaccess nicht erreichbar.
              Füge ich nun noch die Login- und Nutzer-Bedingungen in die if-Abfrage der readfile-Datei hinzu, kann man das Lied nur noch eingeloggt abspielen und beim Abspeichern entsteht eine leere php-Datei.

              Wenn es also nicht noch irgendein Schlupfloch gibt, das mir entgeht, sind die Audio-Dateien auf diese Weise so sicher, wie sie im Netz nur sein können.


              @Zeichen32 & @tk1234
              Ich bin euch unendlich dankbar für die Hilfe und freue mich wie ein Schnitzel, dass ich nun nach so langem Herumgebastel mit nur wenigen Handgriffen alles hinbekommen habe und die Seite bald freigeben kann. Das ist ganz allein euer Verdienst.

              Bleibt bitte alle gesund und habt so viel Spaß beim Programmieren wie ich.
              Eure Black Pearl

              Kommentar


              • #8
                Egal was du glaubst, wenn man etwas abspielen kann, kann mans auch abspeichern. Punkt. Nur weil du es nicht schaffst es abzuspeichern, heißt es noch lange nicht, dass es andere Leute auch nicht schaffen. Weil technisch geht es 100%.

                Kommentar


                • #9
                  Solange er die Inhalte mit einem Login schützt sind zumindest die weitergegebenen Links nicht aufrufbar. Das Abspeichern ist auch nur Mitgliedern möglich, dieses kann man natürlich nicht verhindern, warum auch, die sollen es ja abspielen dürfen.

                  Kommentar


                  • #10
                    Hallo hellbringer, hallo protestix

                    Natürlich ist mir klar, dass mit viel Fachwissen alles hackbar und auslesbar ist. Und dass es keinen 100%-Schutz gibt und geben kann. Es sind ja auch keine geheimen Songs, die niemand hören darf, ich möchte nur vermeiden, dass man die Seite mit den richtigen Links als Downoadportal missbraucht. Daher ging es mir darum, die Dateien mit Login, htaccess und readfile so gut es nur eben geht zu schützen.
                    Für meine Vereinsleute reicht das vollkommen, alle Anderen wissen ja eh nicht, wo sie was suchen müssten. Und solange ich es nicht schaffe, obwohl ich recht gut im Auffinden von "versteckten" Dateien bin, schaffen sie es auch nicht.

                    Danke für eure Hinweise.
                    Bleibt gesund
                    Eure Black Pearl

                    Kommentar


                    • #11
                      Ich war mal so frei und hatte das letzte Script getestet, was an sich ja auch funktioniert. Natürlich ist der Original-Speicherort nicht feststellbar, dennoch kann die Datei natürlich ohne irgendeinen "Schutz" gespeichert werden
                      Grüße Paderman

                      Kommentar

                      Lädt...
                      X