Basti: Speichern ohne Zugang durch URL

Hallo!
Ich weiß jetzt nicht genau, in welchen Bereich meine Frage gehört, aber ich hoffe mal, ich bin hier richtig *gg*
Also meine Frage ist folgende: Wie kann ich Dateien per Upload-Skript auf einen Apache-Server so hochladen, dass sie von außen per URL-Eingabe nicht zu erreichen sind. Ich hab mal gehärt, dass das irgendwie möglich sein soll ("...oberhalb des Root-Verzeichnisses" oder so ähnlich).
Mein Ziel ist es, einen Download anzubieten, bei dem der Anwender nicht sieht woher diese Datei kommt ( aus Sicherheitsgründen!).
Wär cool, wenn ihr ne Idee habt.
Ich danke schon mal recht herzlich :-)
Vielen Dank,
Basti

  1. Hallo!

    Hallo Basti

    Mein Ziel ist es, einen Download anzubieten, bei dem der Anwender nicht sieht woher diese Datei kommt ( aus Sicherheitsgründen!).

    ich würde mir keine datei downloaden ohne zu wissen woher diese datei kommt (aus sicherheitsgründen) ;-)

    gruss
    m.tietz

    1. Hallo m.tietz!

      ich würde mir keine datei downloaden ohne zu wissen woher diese datei kommt (aus sicherheitsgründen) ;-)

      So war das nicht gemeint :-)
      Der Anwender will  bzw. soll ja eine Datei runterladen, er soll nur nicht wissen, wo genau diese Datei liegt. Das es sich um einen seriösen Dienst *hust* handelt, stellt sich diese Frage also nicht.

      1. ok, ich weis was du meinst:

        du bietest einen download an, wenn der user auf den downloadlink klick soll der browser NICHT "schreiben":

        sie möchten folgende datei runterladen: xxx
        von http://xxx.xxx.xx
        von typ: xxx

        ist IMHO nicht möglich, würde ich persönlich auch als "schweren sicherheitsbug" im browser sehen.

        m.tietz

        1. Moin

          du bietest einen download an, wenn der user auf den downloadlink klick soll der browser NICHT "schreiben":

          sie möchten folgende datei runterladen: xxx
          von http://xxx.xxx.xx
          von typ: xxx

          Man Deine Glaskugel möchte ich mal haben...
          TomIRL

          1. Man Deine Glaskugel möchte ich mal haben...

            Meinst du mich? Wieso meinst du, dass das nicht möglich ist??
            So wie Jan das gesagt hat, muss das doch gehen, oder?

            1. Nein ich meinte nicht Dich...
              Der Kollege tiez hat was geschrieben, was man mit einer blühenden Phantasie vielleicht verstehen könnte gewiss aber nicht aus dem ableiten kann was Du als dein Problem beschrieben hast.
              naja Und die Glaskugel vom Kollegen Tiez muß er bei Pfennigpfeifer gekauft haben...

              TomIRL

              1. Nein ich meinte nicht Dich...
                Der Kollege tiez hat was geschrieben, was man mit einer blühenden Phantasie vielleicht verstehen könnte gewiss aber nicht aus dem ableiten kann was Du als dein Problem beschrieben hast.
                naja Und die Glaskugel vom Kollegen Tiez muß er bei Pfennigpfeifer gekauft haben...

                TomIRL

                Na, dann ist  ja gut *gg*
                Aber es muss doch eigetnlich möglich sein, dass ich die Datei dann nach oberhalb des Document Root verschiebe, so dass es dann nicht per URL erreichbar ist (move_uploaded_file). Danach könnte man das doch aber sicherlich wieder downloaden über ein php-skript, oder? auch wenn es ansonsten nicht frei zugänglich ist

                1. Hallo,

                  Aber es muss doch eigetnlich möglich sein, dass ich die Datei dann nach oberhalb des Document Root verschiebe, so dass es dann nicht per URL erreichbar ist (move_uploaded_file). Danach könnte man das doch aber sicherlich wieder downloaden über ein php-skript, oder? auch wenn es ansonsten nicht frei zugänglich ist

                  also ich hab das auch schon gesehen dass man eine datei nur downloaden kann b.s.p. wenn man sich eingeloggt oder registriert hat und dann aber nur einmal die datei
                  downloaden kann,nicht mit einem direkt link anschliessend.Der download wurde dann auf der nächsten seite automatisch ausgelöst.
                  Ich glaube das funtzte damals mit session oder cookie,aber wie ich gesehen habe suchst du noch was besseres also ohne link ?!
                  Ich habe auch ein script das z.B. login daten ausliest unterhalb vom root verzeichniss,wo andere normalerweise kein zugriff haben.
                  Ich denke das sollte mit einem download script auch möglich sein,frag mich aber jetzt nicht wie.

                  Gruss vom Alain

                  --
                  ..."Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." (Albert Einstein)
                2. OK, das klappt alles wunderbar! Die Datei ist per URL nicht zu erreichen.
                  Für interessierte, hier der Beispiel-Code:
                  <form enctype="multipart/form-data" action="<?php $PHP_SELF ?>" method="post">
                   <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
                   Send this file: <input name="userfile" type="file" />
                   <input type="submit" value="Send File" />
                  </form>
                  <?
                  $uploaddir = 'c:/apache/';
                  $uploadfile = $uploaddir . $_FILES['userfile']['name'];

                  print "<pre>";
                  if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
                     print "File is valid, and was successfully uploaded. ";
                     print "Here's some more debugging info:\n";
                     print_r($_FILES);
                  } else {
                     print "Possible file upload attack!  Here's some debugging info:\n";
                     print_r($_FILES);
                  }
                  print "</pre>";

                  Meine nächste Frage *gg* schließt sich im Prinzip direkt daran an:
                  Wie schaffe ich das denn jetzt, dass ich einen Download einbaue, die diese Datei runterlädt?
                  Habt ihr nen Rat?
                  Danke, schonmal :-))

                  1. hi,

                    Meine nächste Frage *gg* schließt sich im Prinzip direkt daran an:
                    Wie schaffe ich das denn jetzt, dass ich einen Download einbaue, die diese Datei runterlädt?

                    rfue ein php-script auf, dem du eine ID oder sonstiges übergibst, um deine datei oberhalb des doc root identifizieren zu können.

                    lasse dieses script zunächst mit header() den geeigneten conten-type ausgeben, und anschliessend die daten aus der datei, mit readfile().

                    gruss,
                    wahsaga

                    1. Hallo wahsaga!
                      Da ich ein absoluter Newbie auf diesem Gebiet bin, sagt mir das ganze leider nicht allzu viel :-(
                      Kannst du mir vielleicht ein Beispielskript zeigen, an dem ich ein wenig rumtesten kann, wie das läuft?
                      Das wäre echt prima....

                      1. Hallo!
                        Ich glaube, dass ich eine Lösung gefunden habe *stolz bin*
                        Das Skript ist unter [1] zu finden.
                        Und so sieht es aus:
                        // $download sei der Bezeichner für die zu ladende Datei
                        // etwa:
                        $download = $_GET['download'];

                        // Dieses Verzeichnis liegt außerhalb des Document Root und
                        // ist nicht per URL erreichbar.
                        //Mein Root-Verzeichnis heißt c:/apache/htdocs/ und die Datei ist   bei mir oberhalb des Root-Verzeichnisses gespeichert. Also so:
                        $basedir = "c:/apache";

                        // Übersetzung von Download-Bezeichner in Dateinamen.
                        $filelist = array(
                          $_GET['download'] => $download );

                        // Einbruchsversuch abfangen.
                        if (!isset($filelist[$download]))
                          die("Datei $download nicht vorhanden.");

                        // Vertrauenswürdigen Dateinamen basteln.
                        $filename = sprintf("%s/%s", $basedir, $filelist[$download]);

                        // Passenden Datentyp erzeugen.
                        //header("Content-Type: application/octet-stream");
                        header("Content-type: application/force_download");
                        // Passenden Dateinamen im Download-Requester vorgeben,
                        // z. B. den Original-Dateinamen
                        $save_as_name = basename($filelist[$download]);
                        header("Content-Disposition: attachment; filename="$save_as_name"");

                        // Datei ausgeben.
                        readfile($filename);

                        Meine letzte Frage lautet jetzt nur: Kann der Anwender irgendwo her sehen, wo diese Datei herkommt?
                        Danke für die ganze Hilfe!!!!!

                        [1] http://www.dclp-faq.de/q/q-datei-download.html

                        1. hi,

                          Meine letzte Frage lautet jetzt nur: Kann der Anwender irgendwo her sehen, wo diese Datei herkommt?

                          nein, natürlich nicht.
                          er ruft das php-script auf, mit einem parameter, und bekommt die dateidaten zum downoad angeboten.

                          aber selbst wenn er es könnte - wo wäre das problem? da die datei ja oberhalb des web roots liegt, käme er über http ja doch wieder nicht dran ...

                          gruss,
                          wahsaga

                          1. Sagt mal, kennt ihr Anbieter, ide es erlauben, oberhalb des Root-Verzeichnisses zu speichern? Bei mir geht das nämlich nur lokal :-(
                            Danke, Basti

          2. hi,

            Man Deine Glaskugel möchte ich mal haben...

            wieso, sie taugt doch offenbar recht wenig.

            dass es hier wahrscheinlich um ein downloadscript geht, welches einen parameter übergeben bekommt und dann die nicht direkt über http erreichbare datei einfach durchschleust, hat sie ihm ja immer noch nicht verraten können ...

            gruss,
            wahsaga

            1. Moin Wahsaga

              Man Deine Glaskugel möchte ich mal haben...

              wieso, sie taugt doch offenbar recht wenig.

              dass es hier wahrscheinlich um ein downloadscript geht, welches einen parameter übergeben bekommt und dann die nicht direkt über http erreichbare datei einfach durchschleust, hat sie ihm ja immer noch nicht verraten können ...

              Wenn Seine Vermutung aber richtig wäre, dann wäre es doch ein tolles Teil oder nicht?

              Viel Spaß noch
              TomIRL

          3. du meinst ich war vielleicht zu übereifrig und hätte mal besser zwischen den zeilen lesen sollen ?

            asche über mein haupt !!

            Man Deine Glaskugel möchte ich mal haben...

            wird gerade bei e-bay versteigert (hat´s nicht gebracht)

            gruss
            m.tietz

  2. Hi,
    Du musst unterscheiden zwischen dem Pfad der URL und deines PHP Skripts. Wenn Dein DocumentRoot z.B. /home/www/ ist, dann ist die Datei /home/www/index.php als http://deinedomain.de/index.php verfuegbar. Wenn Du jetzt einen Dateiupload [1] anbietest, musst Du nur beim Aufruf von move_uploaded_file() ein Verzeichnis unterhalb von /home/www angeben.

    Gruss,
    Jan

    [1] http://de3.php.net/manual/en/features.file-upload.php

  3. Also:
    Du möchtest dass nicht etwa ein link verschickt werden kann der direkt das Dokument downloaden kann.
    Nach dem Motto:
    http://www.domain.tld/blablub.pdf
    Dazu folgende Checkliste:
    Hast Du Zugriff auf Verzeichnisse oberhalb der Dokumentenroot?
    Ja/nein
    Wenn ja dann siehe Jan
    Wenn nein,

    hast du die Möglichkeit die Domain in ein Verzeichnis der Dokumentenroot zu verweisen?
    Ja /nein
    Wenn ja dann Verzeichnis anlegen.
    Und einfach oberhalb des Domainverzeichniss ablegen.
    Wie siehe Jan..
    Wenn Nein dann...

    Hast Du die Möglichkeit .htaccess eine entsprechende Umeitlung mit modrewrite zu legen?
    Ja /nein
    Wenn Ja dann Verzeichnis anlegen.. Mod rewrite benutzen..
    Wie? Siehe jan!

    Viele Grüße TomIRL