Interne Downloads (mit Login) per .htaccess Referer schützen?

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

  • Interne Downloads (mit Login) per .htaccess Referer schützen?

    Hallo Zusammen,
    ich habe einen Login (Benutzer/Passwort) der das Zugreifen auf eine interne Linkliste mit PDFs ermöglicht.
    Da die PDF-Dateien aber auch ohne Login (falls man den Ordner- und Dateinamen weiß) ohne Login aufrufen könnte, will ich den Ordner mittels .htaccess REFERER schützen.

    Ein normaler .htaccess Passwortschutz wäre auch möglich, ich bin mir aber nicht sicher, wie ich den realisieren soll, ohne Benutzer und Passwort im Header (URL) zu übergeben... (Benutzer und Passwort stehen in einer mySQL-DB)

    Also meine Frage: Ist die .htaccess-Referer-Lösung sinnvoll?
    Sendet jeder Browser eine Referer?

    Hat jemand ggf. eine bessere Idee wie man mein Problem lösen könnte?

    Danke für Hinweise und Tipps,
    dreman

  • #2
    Auf Referer kannst du dich nicht verlassen, wird nicht immer mitgeschickt.

    Vernagel das Verzeichnis mit .htaccess und mach den Download über download.php?file=x.

    Kommentar


    • #3
      Also meine Frage: Ist die .htaccess-Referer-Lösung sinnvoll?
      Sendet jeder Browser eine Referer?

      Hat jemand ggf. eine bessere Idee wie man mein Problem lösen könnte?
      Nein, sinnvoll ist das nicht, weil entweder kein Referer oder ein gefakter geschickt werden könnte.

      Die meisten Browser senden einen. Lässt sich aber in der Konfig ändern

      Eine zentrale PHP Datei, die anhand eines GET Parameters das PDF einliest und an den Client ausgibt. Damit brauchst du auf das Verzeichnis mit den PDFs nur Filesystemzugriff und kannst eine htaccess anlegen, die den Zugriff via URL komplett verbietet.
      Die zentrale PHP Datei kann auch sicherstellen, dass nur authorisierte User die PDFs lesen können
      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

      Kommentar


      • #4
        Okay, vielen Dank für die Hinweise:

        Also etwa so:
        .htaccess (in 'geheim'):
        PHP-Code:
        RewriteEngine On
        RewriteCond 
        %{REQUEST_FILENAME} -f
        RewriteRule 
        ^geheim/(.+)$ download.php?file=$
        download.php (in 'geheim'):
        PHP-Code:
        <?php
        header
        ('Content-Type: application/octet-stream');
        include (
        "../php/login.php");
        $file basename($_GET['file']);

        if(
        file_exists('geheim/' $file) && ($login == "yes")){
        readfile('geheim/' $file);
        }
        else{
        echo 
        "Kein Berechtigung!";
        }
        ?>
        Welchen Content-Type gebe ich am besten an, wenn ich auch andere Dateien außer PDF anbieten möchte?
        Oder muss ich die angeforderte Datenendung auslesen und den entsprechenden Content-Type senden?

        Kommentar


        • #5
          Code:
          //.htaccess
          Order Deny,Allow
          Deny from All
          Oder muss ich die angeforderte Datenendung auslesen und den entsprechenden Content-Type senden?
          Genau so sollte man das machen
          PHP-Code:
          if(file_exists('geheim/' $file) && ($login == "yes")){ 
          Eine sicherheitskritische Variable wie $login würde ich als Boolean anlegen. Sonst könnte man je nach Server Config (Register_globals ON) und deinem Programmierstiyle das ganze Konzept mittels einer einfachen GET Var umgehen. Wenn du sie als Boolean anlegst, dann solltest du zum Vergleich auch den ===-Operator benutzen. Oder aber, wenn du keinen Boolean verwenden willst MUSST du die Var $login etnsprechend mit einem Wert initialisieren (z.B. $ogin = 'no')
          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

          Kommentar


          • #6
            Danke!

            @login: Ja, da hast du natürlich recht. Sry!
            War nur schnell hingeschrieben... =)

            @htaccess:
            Ist
            Order Deny,Allow
            Deny from All
            denn nötig?
            Es werden doch schon alle Anfragen die auf eine Datei in "geheim" zeigen auf "download.php" umgeleitet?

            Muss es dann so heißen?:
            Code:
            //.htaccess
            Order Deny,Allow
            Deny from All
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} -f
            RewriteRule ^geheim/(.+)$ download.php?file=$1

            Kommentar


            • #7
              Entweder Rewriting oder Deny all.

              Btw: Führt dein Rewriting nicht zu einer endlosen Umleitung?

              Kommentar


              • #8
                Die Sache mit der RewriteRule ist sicher Geschmackssache. Kannst du auch benutzen. Ich für meinen Teil finde es sauberer wenn der User oder Bot, der das PDF direkt aufrufen will, eine entsprechende Fehlerseite bekommt. Damit er auch weiss, dass es sich um einen nicht-erlaubten Zugriff handelt.
                EDIT:

                Solange du nicht extern umleitest wird wohl wie onemorenerd sagt eine unendliche Weiterleiterei stattfinden

                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar


                • #9
                  Danke für die Hinweise:

                  Habe es jetzt so gelöst:

                  im Ordner "geheim" liegt meine .htaccess-Datei

                  Code:
                  RewriteEngine On
                  RewriteRule ^(.*\.(pdf))$ download.php?file=$1
                  RewriteRule ^(.*\.(zip))$ download.php?file=$1
                  RewriteRule ^(.*\.(ppt))$ download.php?file=$1
                  Diese leitet alle PDF, ZIPs und PPTs auf download.php um.
                  (dort findet dann die Berechtigungsprüfung mit header-Auswahl statt)

                  Allerdings halte ich die Lösung noch nicht besonders toll (.htaccess-Teil).

                  Ich würde es gerne andersherum haben:
                  wie:
                  Leite alle Nicht-PHP-Dateien an download.de weiter...

                  Mein Versuch:
                  Code:
                  RewriteEngine On
                  RewriteRule !^(.*\.(php))$ download.php?file=$1
                  Hat leider nicht funktioniert?

                  Hat jemand eine Idee?

                  Danke, soweit für alle Hilfe.
                  dreman

                  Kommentar


                  • #10
                    Versuch mal das:

                    RewriteRule \.php$ - [L]
                    RewriteRule (.*) download.php?file=$1

                    Kommentar

                    Lädt...
                    X