Jan K.: Content Type

Hallo zusammen,

da ich Inhalte (.pdf, .doc, .txt, .jpg usw.) die man in einem internen Bereich hochladen kann gerne von äusseren Zugriffen schützen möchte habe ich mir ein Script gebastelt welches den Download der Datei (aus einem geschützten Verzeichnis) nur mit gültigem Login erlaubt.
Dieser Teil arbeitet soweit gut:

  
if($_SESSION[logon][0]){  
  $path="/xampp/htdocs/XYZ/".$_GET[path];  
  $filename=$_GET[filename];  
  header("Content-Type: application/octetstream");  
  header('Content-Disposition: attachment; filename="'.$filename.'"');  
  readfile($path);  
}  
else{  
  echo error_0("No permission.","index.php");  
}  
die;  

Nun möchte ich aber auch gerne das man sich die Dokumente auch im Browser, ohne vorheriges downloaden, anschauen kann. Da ich nicht für jede erdenkliche Dateiendung den passenden Content Type einbauen will (gibt es für alle bekannten Dateitypen eine Liste für die Namen der Content Types?) suche ich einen Content Type der die geläufigsten Dokumente ausspucken kann (jpg,png,gif,pdf,txt,doc).

Wie erreiche ich mein Ziel?/Konstruktive kritik erwüscht!

Gruß,
Jan

  1. hi,

    [..] Da ich nicht für jede erdenkliche Dateiendung den passenden Content Type einbauen will (gibt es für alle bekannten Dateitypen eine Liste für die Namen der Content Types?) suche ich einen Content Type der die geläufigsten Dokumente ausspucken kann (jpg,png,gif,pdf,txt,doc).

    Eine solche Liste findest Du auf meinem Server, es ist eine Datei, die zum Apache Webserver gehört (mime.types).

    "Content-Type: application/octetstream"

    ist der Default, den Du suchst, den hast Du also schon gefunden. Was jedoch beim Besucher gleich im Browser aufgeht oder zum Speichern auf der Festplatte angeboten wird, ist von der Konfig. des BesucherPCs abhängig und vom Browser den er benutzt.

    Btw., beim Upload den Content-Type gleich mit zu speichern, wäre nicht weiter aufwendig, ist jedoch auch vom Browser abhängig, also was der an Informationen dazu mitgibt.

    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. So,

      mime_content_type ist veraltet und in PHP 5.3.0 durch finfo ersetzt.
      http://de3.php.net/manual/de/function.finfo-open.php

      Wenn ich probiere finfo zu benutzen werde ich angemeckert:
      Fatal error: Call to undefined function finfo_open() in C:\xampp\htdocs\******\includes\view.php on line 6

      phpinfo() sagt mir:
      PHP Version 5.3.0
      PECL Version 2.1.6

      Wieso kennt mein (xampp) webserver kein finfo!?

  2. Hi,

    if($_SESSION[logon][0]){
      $path="/xampp/htdocs/XYZ/".$_GET[path];
      $filename=$_GET[filename];

      
    mit welchen Werten hast Du die Konstanten logon, path und filename definiert?  
      
    
    > ~~~php
      
    
    >   header("Content-Type: application/octetstream");  
    > 
    
    

    Dieser MIME-Type ist ungültig. Ein ähnlicher lautet "application/octet-stream", meinst Du den vielleicht? Ansonsten wäre noch "application/x-contentstream" erlaubt.

    (gibt es für alle bekannten Dateitypen eine Liste für die Namen der Content Types?)

    Es gibt eine Funktion, die Dir den MIME-Type zu einer Datei liefert.

    Wie erreiche ich mein Ziel?/Konstruktive kritik erwüscht!

    Also, ich habe Dein Ziel erreicht, indem ich in der PHP-Doku nach "mime" gesucht und wenige Male geklickt habe. Ich vermute, Du erreichst es auf ähnliche Weise.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. $_SESSION[logon][0] ist TRUE falls das Loginscript den Benutzer authentifiziert hat, ansonsten FALSE

      Mit $_GET[path] und $_GET[filename] übergebe ich den Namen und Pfad der auszugebenden Datei. [z.B. $_GET[path]="streng_geheim/"(htacces) $_GET[filename]="id_datum_worumgehtes_benutzername.dateiendung"]

      1. Hi!

        $_SESSION[logon][0] ist TRUE falls das Loginscript den Benutzer authentifiziert hat, ansonsten FALSE

        Was Cheatah mit den Konstanten meinte, ist: Why is $foo[bar] wrong?

        Lo!

    2. Hallo Cheatah,

      application/octetstream
      Dieser MIME-Type ist ungültig.

      das ist Unsinn. Es gibt keine gültigen oder ungültigen Media-Typen. Es gibt nur registrierte und nicht registrierte. Trieft ein Programm auf einen nicht registrierten Media-Type, wäre es wohl als fehlerhaft zu bezeichnen, wenn es kein standardisierten Umgang damit hätte. Im Fall eines Browsers wird produktübergreifend dazu dem Nutzer ein Dialog angeboten, was mit dem Medium gemacht werden soll.

      Hallo Jan,

      (gibt es für alle bekannten Dateitypen eine Liste für die Namen der Content Types?)

      Ja. Sieh Dir bitte http://www.iana.org/assignments/media-types/ an!

      Gruß aus Berlin!
      eddi

      --
      Was haben wir denn heute? "Kampf der Titanen" - Aha! Es treten an 0 und 1.
      1. Tach,

        das ist Unsinn. Es gibt keine gültigen oder ungültigen Media-Typen. Es gibt nur registrierte und nicht registrierte.

        und nicht registrierte _müssen_ mit "X-" beginnen:

        "No character set name other than those defined above may be used in
           Internet mail without the publication of a formal specification and
           its registration with IANA, or by private agreement, in which case
           the character set name must begin with "X-"." - RFC 2046

        ein nicht registrierter Wert, der anders beginnt widerspricht dem Standard und ist somit durchaus als ungültig zu betrachten.

        mfg
        Woodfighter

        1. Hallo Jens,

          "...in which case the character set name must begin with "X-"."

          das ist ein Auszug aus 4.1.2. Sektion 4.1 beschreibt aber den Media-Typ "text" - nicht "application". Das Prefix "X-", wie zu lesen ist, gilt für nicht registrierte CHARSETS. 4.5 ist die richtige Passage für "appication":

          4.5.3. Other Application Subtypes

          It is expected that many other subtypes of "application" will be
             defined in the future.  MIME implementations must at a minimum treat
             any unrecognized subtypes as being equivalent to "application/octet-
             stream".

          ein nicht registrierter Wert, der anders beginnt widerspricht dem Standard und ist somit durchaus als ungültig zu betrachten.

          ^^

          Gruß aus Berlin!
          eddi

          --
          Was haben wir denn heute? "Kampf der Titanen" - Aha! Es treten an 0 und 1.
          1. Tach,

            "...in which case the character set name must begin with "X-"."

            das ist ein Auszug aus 4.1.2. Sektion 4.1 beschreibt aber den Media-Typ "text" - nicht "application".

            äh danke, lesen für Anfänger.

            mfg
            Woodfighter

          2. Moin!

            "...in which case the character set name must begin with "X-"."

            das ist ein Auszug aus 4.1.2. Sektion 4.1 beschreibt aber den Media-Typ "text" - nicht "application". Das Prefix "X-", wie zu lesen ist, gilt für nicht registrierte CHARSETS. 4.5 ist die richtige Passage für "appication":

            Sektion 6 in diesem Dokument behandelt grundsätzlich den Präfix "x-" in Mimetypen.

            ein nicht registrierter Wert, der anders beginnt widerspricht dem Standard und ist somit durchaus als ungültig zu betrachten.

            ^^

            Das würde ich in Sektion 6 als bestätigt sehen.

            - Sven Rautenberg

            1. Hallo Sven,

              Das würde ich in Sektion 6 als bestätigt sehen.

              ja; nur wünschte ich, dass Cheatah sich nach einem seiner pampigen Überbügler mal die Mühe machen würde...

              Gruß aus Berlin!
              eddi

              --
              Was haben wir denn heute? "Kampf der Titanen" - Aha! Es treten an 0 und 1.
  3. Hi,

    Nun möchte ich aber auch gerne das man sich die Dokumente auch im Browser, ohne vorheriges downloaden, anschauen kann.

    Das kann nicht gehen. Das Dokument muß erst vom Server zum Client, also heruntergeladen werden - wie sonst sollte der Client (Browser/...) es anzeigen?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  4. Hallo Jan,

    Nun möchte ich aber auch gerne das man sich die Dokumente auch im Browser, ohne vorheriges downloaden, anschauen kann.

    biete parallel zum Link für den down load, wenn er unbedingt sein soll, einen weiteren Link direkt auf die Datei an. Nutzer sollten m. E. so referenzierte Dateien auch selbständig, also ohne das Konstruk über einen Content-Disposition-Header, der übrigens nichts mit dem HTTP zutun hat, speichern können.

    Gruß aus Berlin!
    eddi

    --
    Was haben wir denn heute? "Kampf der Titanen" - Aha! Es treten an 0 und 1.
    1. Hallo Jan,

      Nun möchte ich aber auch gerne das man sich die Dokumente auch im Browser, ohne vorheriges downloaden, anschauen kann.

      biete parallel zum Link für den down load, wenn er unbedingt sein soll, einen weiteren Link direkt auf die Datei an. Nutzer sollten m. E. so referenzierte Dateien auch selbständig, also ohne das Konstruk über einen Content-Disposition-Header, der übrigens nichts mit dem HTTP zutun hat, speichern können.

      Gruß aus Berlin!
      eddi

      Ein Link direkt auf die Datei geht nicht, weil es nur von authentifizierten Leuten möglich sein soll. Wenn ich einen Link auf ein mit htacces geschütztes Verzeichnis lege poppt das htaccess fenster auf.

      Daher der Umweg über ein PHP Script das je nach Dateityp die Datei ausgibt wenn Zugang gewährt werden soll.

      1. Re:

        Ein Link direkt auf die Datei geht nicht, weil es nur von authentifizierten Leuten möglich sein soll. Wenn ich einen Link auf ein mit htacces geschütztes Verzeichnis lege poppt das htaccess fenster auf. Daher der Umweg über ein PHP Script das je nach Dateityp die Datei ausgibt wenn Zugang gewährt werden soll.

        Das ist aber ein konzeptioneller Fehler. Die Dateien sollen ja ausdrücklich nicht geschützt werden. Sie werden ja per PHP-script ausgegeben. Du solltest also, bevor Du im HTTP mit einem Content-Disposition-Header herummanscht, Dein offensichtlich widersprüchliches Konzept überarbeiten.

        Zu Deinem Posting unter Ralfs Posting:

        PHP besteht aus einem Kern, der Grundfunktionalität der Scriptsprache bereitstellt, und modularen Erweiterungen. Diese Erweiterungen werden allermeist in Programmbibliotheken abgelegt. Da sie modular sind, kann PHP ohne Erweiterungen arbeiten. file info ist eine Erweiterung. Sie ist entweder nicht im xampp enthalten oder nicht aktiviert worden.

        Gruß aus Berlin!
        eddi

        --
        Was haben wir denn heute? "Kampf der Titanen" - Aha! Es treten an 0 und 1.
  5. if($_SESSION[logon][0]){
      $path="/xampp/htdocs/XYZ/".$_GET[path];
      $filename=$_GET[filename];
      header("Content-Type: application/octetstream");
      header('Content-Disposition: attachment; filename="'.$filename.'"');
      readfile($path);
    }
    else{
      echo error_0("No permission.","index.php");
    }
    die;

      
    Hallo,  
      
    sei bitte vorsichtig mit diesem Code.  
    Wenn jemand angemeldet ist, kann er Dir jede (!) Datei von Deinem Server runterladen.  
    Setzt man z.B. ?path=../../../windows/blablabla.txt wird dieses ohne Check gesendet. Bitte korrigiert mit, wenn falsch liege.  
      
    Grüße  
    - Steffen
    
    1. sei bitte vorsichtig mit diesem Code.
      Wenn jemand angemeldet ist, kann er Dir jede (!) Datei von Deinem Server runterladen.
      Setzt man z.B. ?path=../../../windows/blablabla.txt wird dieses ohne Check gesendet. Bitte korrigiert mit, wenn falsch liege.

      Und wahrscheinlich kann man mit ?path=../index.php Deinen Source-Code studieren ...

      Mache wenigstens ein Überprüfung vor den readfile, ob die Datei wirklich unterhalb von Deinem XYZ Verzeichnis liegt.

      Grüße

      • Steffen
      1. Hi!

        Mache wenigstens ein Überprüfung vor den readfile, ob die Datei wirklich unterhalb von Deinem XYZ Verzeichnis liegt.

        Diese kann man vornehmen, indem man mit realpath() den zusammengesetzten Dateinamen in seine absolute Schreibweise auflöst und dann den Anfang mit dem Downloadpfad vergleicht.

        Lo!