Markus M: Dateien schützen... auch so???

Hallo Forumianer!

Ist es eigentlich möglich, einen Download (.zip o.a. Datei) so zu machen, dass er nur startbar ist, wenn der User vonn einer bestimmten Seite kommt?

Beispiel:
Datei "http://www.domain.de/download/dl.zip" darf NUR von der Datei "http://www.domain.php/blabla.php" aufgerufen werden.

Lösungsvorschlag:
Vielleicht, dass der Ordner "http://domain.de/download" für alle User (mittels htaccess), auser für den PHP-Prozessor geschützt wird. Dann eine PHP-Datei (die nicht in diesem Ordner liegt), die bei Aufruf in den geschützten Ordner zugreift und dann die geschützte Datei für diesen einen Download freigibt.

Nur wie programmiere ich das?

Oder ist das irgendwie möglich????

Gruss Markus

  1. Hi,

    Datei "http://www.domain.de/download/dl.zip" darf NUR von der Datei "http://www.domain.php/blabla.php" aufgerufen werden.

    erstens sind es keine Dateien, sondern Ressourcen. Zweitens ist HTTP zustandslos, d.h. ein "von irgendwo" ergibt keinen Sinn. Referer, das einzige Indiz, sind fälschbar und damit nutzfrei. Dein Problem ist nicht lösbar.

    Vielleicht, dass der Ordner "http://domain.de/download" für alle User (mittels htaccess), auser für den PHP-Prozessor geschützt wird.

    PHP greift auf Dateien zu, nicht auf Ressourcen, d.h. ein serverseitiger Schutzmechanismus greift nicht. Entweder ist das PHP-Script an sich geschützt, was Dein Problem lediglich verschiebt, oder aber es ist exakt so ungeschützt wie die ZIP-Ressource selbst.

    Cheatah

    --
    X-Will-Answer-Email: No
    1. Hallo,

      Was will ich damit bezwecken:
      Ich habe interne Seiten (PHP), die mittels Sessions geschützt sind, in einem Unterordner der Internen Daten liegen einige zip-Dateien, die auch geschützt sein sollen.
      Problem: Man kann zip-Dateien (logischerweise) nicht mit Sessions schützen.
      htaccess mit einer password-abfrage kommt desshalb nicht in Frage, weil ich auf diesem Server mehrere Interne (die unabhängig von einander sind) bereiche, einer davon ist mit htaccess geschützt, aber mein Server erlaubt mir nur die Speicherung einer htusers-Datei (alle anderen Dateinamen sind für htaccess-User-Listen gesperrt).

      Mein Gedanke:
      Die Dateien werden in einem Ordner gespeichert, der zugriffe (egal von wo her) nicht zulässt, wenn man eine der Dateien downloaden will, soll der PHP-Prozessor die Datei zwischenspeichern o.a. bis sie gedownloadet wurde.

      Gruss Markus

      1. Hi,

        Problem: Man kann zip-Dateien (logischerweise) nicht mit Sessions schützen.

        so logisch finde ich das eigentlich nicht. Wer hindert Dich daran, die Datei in einem nicht per HTTP zugänglichen Verzeichnis abzulegen und den Zugriff nur über ein PHP-Script zu erlauben?

        htaccess mit einer password-abfrage kommt desshalb nicht in Frage, weil ich auf diesem Server mehrere Interne (die unabhängig von einander sind) bereiche, einer davon ist mit htaccess geschützt, aber mein Server erlaubt mir nur die Speicherung einer htusers-Datei

        Argl. Wer zur Hölle hat sich denn _das_ ausgedacht?! Vielleicht erlaubt der Server (der damit eigentlich nicht viel zu tun haben dürfte) ja die Speicherung einer htotherusers-Datei.

        Die Dateien werden in einem Ordner gespeichert, der zugriffe (egal von wo her) nicht zulässt,

        Ja, richtig.

        wenn man eine der Dateien downloaden will, soll der PHP-Prozessor die Datei zwischenspeichern o.a. bis sie gedownloadet wurde.

        Huh? Das verstehe ich nicht.

        Cheatah

        --
        X-Will-Answer-Email: No
        1. Hi,

          Problem: Man kann zip-Dateien (logischerweise) nicht mit Sessions schützen.

          so logisch finde ich das eigentlich nicht. Wer hindert Dich daran, die Datei in einem nicht per HTTP zugänglichen Verzeichnis abzulegen und den Zugriff nur über ein PHP-Script zu erlauben?

          Genau das meine ich doch!!! Ich habe ja gefragt, wie ich das machen kann!

          htaccess mit einer password-abfrage kommt desshalb nicht in Frage, weil ich auf diesem Server mehrere Interne (die unabhängig von einander sind) bereiche, einer davon ist mit htaccess geschützt, aber mein Server erlaubt mir nur die Speicherung einer htusers-Datei

          Argl. Wer zur Hölle hat sich denn _das_ ausgedacht?! Vielleicht erlaubt der Server (der damit eigentlich nicht viel zu tun haben dürfte) ja die Speicherung einer htotherusers-Datei.

          Die Dateien werden in einem Ordner gespeichert, der zugriffe (egal von wo her) nicht zulässt,

          Ja, richtig.

          wenn man eine der Dateien downloaden will, soll der PHP-Prozessor die Datei zwischenspeichern o.a. bis sie gedownloadet wurde.

          Huh? Das verstehe ich nicht.

          Cheatah

          Gruss Markus

          1. Hi Markus,

            so logisch finde ich das eigentlich nicht. Wer hindert Dich daran, die Datei in einem nicht per HTTP zugänglichen Verzeichnis abzulegen und den Zugriff nur über ein PHP-Script zu erlauben?
            Genau das meine ich doch!!! Ich habe ja gefragt, wie ich das machen kann!

            welches Problem hast Du mit der Umsetzung von Cheatahs Anleitung?

            Viele Grüße
                  Michael

      2. Hi Markus,

        htaccess mit einer password-abfrage kommt desshalb nicht in Frage, weil ich auf diesem Server mehrere Interne (die unabhängig von einander sind) bereiche, einer davon ist mit htaccess geschützt, aber mein Server erlaubt mir nur die Speicherung einer htusers-Datei (alle anderen Dateinamen sind für htaccess-User-Listen gesperrt).

        ... und? Was hindert Dich daran, alle Benutzer in eine solche Datei einzutragen und dann mit Gruppen zu arbeiten? (Höchstens, daß dann die Benutzernamen unique sein müssen und Du das vielleicht nicht willst.)

        Viele Grüße
              Michael

  2. hi Markus,

    vielleicht kannst du uns sagen, was du mit einer derartigen konstruktion bezweckst; vielleicht gibt es eine andere lösung ...

    mfg
    mamue

  3. Hi

    Ist es eigentlich möglich, einen Download (.zip o.a. Datei) so zu machen, dass er nur startbar ist, wenn der User vonn einer bestimmten Seite kommt?

    Beispiel:
    Datei "http://www.domain.de/download/dl.zip" darf NUR von der Datei "http://www.domain.php/blabla.php" aufgerufen werden.

    Lösungsvorschlag:
    Vielleicht, dass der Ordner "http://domain.de/download" für alle User (mittels htaccess), auser für den PHP-Prozessor geschützt wird. Dann eine PHP-Datei (die nicht in diesem Ordner liegt), die bei Aufruf in den geschützten Ordner zugreift und dann die geschützte Datei für diesen einen Download freigibt.

    Ich weiß nicht ob das geht, aber ich würde es so machen:
    Die zu schützenden Dateien liegen in einem von aussen nicht erreichbaren Verzeichnis (ausserhalb des Htdocs oder via htaccess) auf die der PhP Prozessor aber zugriff hat. Nun kannst du über ein Script in einer beliebigen Sprache die Datei einlesen und mit dem richtigen Content-Type wieder an den User ausgeben. Das ganze ist dann wie ein Script das Bilder aus einer DB holt. Die Authentifizierung sollte über sessions oder ähgnliches leicht möglich sein.
    Der Nachteil hievon ist halt, das IMHO recht recourcenfressend ist.

    Ich hoffe ich habe das Problem richtig verstanden.

    mfg

    Anarazel
    mfg
    Andres Freund

    1. Wunderbar. Du hasst mein Problem richtig verstanden!

      Nur für meine kenntnisse ist der Zugriff über ein Script (z.B. PHP) zu schwierig.

      Hasst du ein Codebeispiel???

      Gruss Markus

      1. Hi

        Wunderbar. Du hasst mein Problem richtig verstanden!

        Nur für meine kenntnisse ist der Zugriff über ein Script (z.B. PHP) zu schwierig.

        Hasst du ein Codebeispiel???

        Jaein, ich kann kein Php, aber ich denke es ist in PhP ähnlich lösbar wie in Perl(kennst du ein Script das Bilder aus einer Db holt? Wenn ja, dann köntest du dieses umschreiben).
        Ich schreib mal einfach die Vorgehensweise in neutralen Code auf:
        In der Html/PhP Datei steht der folgende Link:
        <a href="zipraus.php?sess_id=1234567890&datei=1.zip">Zip-Datei</a>
        in der Php vom Schema her folgendes:

        if sess_id is valid # irgendein Prüfungsmechanismuss...kann auch ein Passwort sein
        {
        open 1.zip
        print "content-type:#hier der richtige Content-Type fütr zips. Ich würd mal googlen

        #wenn du auf einem win System arbeitest, musst du hier (zumindest in perl) auf Binmode umstellen
        Variable balblabla = zipdatei
        print blablabla
        close 1.zip
        }
        else
        {
        falsche sess_id bitte nochmal probieren
        }

        Ich hoffe das war verständlich. Falls nicht, kann ich mal das kleine Perl script posten.

        mfg
        Andres Freund

        1. Recht unverständlich.
          Könntest du das script nicht posten???

          Wär echt nett!

          Gruss Markus

          1. Hi

            Recht unverständlich.
            Könntest du das script nicht posten???

            Wär echt nett!

            Gruss Markus

            Ist halt Perl, da ich kein PhP kann. Ich musste das Script schnell aus dem Kopf schreiben, weil ich das alte nicht mehr gefunden habe. Mir fällt momentan nicht mehr ein wie man einen Dateinamen für die Zips vergibt. Bei einigen Browsern wird für die Zip Datei nähmlich der Namen zip.pl vorgeschlagen, was natürlich nicht sonderlich praktisch ist. Aber da kann dir sicher jemand aus dem Forum helfen.

            Ich weiß nicht inwiefern das Script portabel auf PhP ist.

            #######################
            aufruf:
            <a href="zip.pl?pw=123&datei=123.zip">Zip Datei herunterladen</a>

            ###zip.pl##############
            #!/usr/bin/perl -w
            use strict;
            use CGI::Carp qw(fatalsToBrowser);
            use CGI;
            my $cgi = new CGI;
            my $name = $cgi->param("datei");#hiermit bekommst du die Parameter aus der Url
            my $pw = $cgi->param("pw");#hiermit bekommst du die Parameter aus der Url
            if ($pw == 123)# hierfür besser ein session Mechanismus. aber ich hatte keine Zeit mehr.
            {
                 print "Content-type: application/x-zip-compressed\n\n"; #damit es der Browser richtig speichert.
                 open (DATEI ,"$name");
                 binmode DATEI;
                 my @data = <DATEI>;
                 close (DATEI);
                 print @data;
            }
            else
            {
                 print "Content-Type: text/html\n\n";
                 print "Sorry Pw ist falsch";
            }
            #########################

            Falls was nicht klar ist, ich bin für Fragen offen.
            mfg
            Andres Freund

            1. Wunderbar. Danke

              muss ich gleich mal ausprobieren!

              Gruss Markus

            2. Hi Andres,

              Ist halt Perl, da ich kein PhP kann. Ich musste das Script schnell aus dem Kopf schreiben, weil ich das alte nicht mehr gefunden habe.

              viele Hiebe. :-(

              <a href="zip.pl?pw=123&datei=123.zip">Zip Datei herunterladen</a>

              Aha - ein Parameter mit dem Dateinamen. Schon mal was von "tainted" gehört?

              my $name = $cgi->param("datei");#hiermit bekommst du die Parameter aus der Url
                   open (DATEI ,"$name");

              Diesen Parameter dann unbehandelt in einen system call - und offen ist das Scheunentor.

              Viele Grüße
                    Michael

              P.S.: xwolf, wo bist Du?

              1. Hi»» Hi Andres,

                Ist halt Perl, da ich kein PhP kann. Ich musste das Script schnell aus dem Kopf schreiben, weil ich das alte nicht mehr gefunden habe.

                viele Hiebe. :-(

                Warum?

                <a href="zip.pl?pw=123&datei=123.zip">Zip Datei herunterladen</a>

                Aha - ein Parameter mit dem Dateinamen. Schon mal was von "tainted" gehört?

                Nein, was ist das?

                my $name = $cgi->param("datei");#hiermit bekommst du die Parameter aus der Url
                     open (DATEI ,"$name");

                Diesen Parameter dann unbehandelt in einen system call - und offen ist das Scheunentor.

                Das sollte auch nur ein Beispiel sein, wie man es machen kann, natürlich sollte man davor prüfen, ob die angeforderte Datei eine der "öffentlichen" Dateien ist. Indem man z.B. $datei mit dem Inhalt eines Arrays vergleicht.
                Eigentlich dachte ich, ich hätte dazugeschrieben, dass das nur ein Schema ist, aber _leider_ habe ich das in der Eile vergessen.

                Auf solche Sachen werde ich in Zukunft auch in Postings achten, da ich bemerkt habe, als ich den Thread nochmal durchgelesen habe, dass das leicht als fertiges Script betrachtet werden kann.

                mfg
                Andres Freund

                1. Hi Andres,

                  <a href="zip.pl?pw=123&datei=123.zip">Zip Datei herunterladen</a>
                  Aha - ein Parameter mit dem Dateinamen. Schon mal was von "tainted" gehört?
                  Nein, was ist das?

                  http://gunther.web66.com/FAQS/taintmode.html

                  Viele Grüße
                        Michael

                  --
                  T'Pol: I meant no insult.
                  V'Lar: Of course not. You're simply speaking your mind ... as you always have.
                  1. Hi

                    Aha - ein Parameter mit dem Dateinamen. Schon mal was von "tainted" gehört?
                    Nein, was ist das?

                    http://gunther.web66.com/FAQS/taintmode.html

                    Danke, ich habs inzwischen auch in Google gefunden. Ich hätte eigentlich gleich selber suchen sollen, aber naja.
                    Auf jedenfall Danke.
                    Und noch Entschuldigung für den Schock ;-)

                    mfg
                    Andres Freund