Fritz: file upload - nur existierende Datei überschreiben zulassen

Hallo,

per html Formular (passwortgeschützt) kann mein user eine bereits auf dem Server liegende Datei überschreiben - und _nur_ diese Datei. Damit möchte ich sicherstellen, daß der user nur bestimmte Dateien (= exakt gleicher Dateiname) aktualisieren kann, aber keine neuen Dateien hochladen.

Mein Ansatz dazu:

<?
$updir = "/home/meindir/updir";

/* file ausgewählt? */
if (!$file_name) {
die("<p>Keine Datei zum upload ausgewählt.</body></html>");
}

/* file speichern */
if (file_exists("$updir/$file_name")) {
@copy($file, "$updir/$file_name");
echo("<p>Dateiupload erfolgreich.</body></html>");
}
?>

Das funktioniert auch so weit - _meistens_?
Aber nicht immer!
Von usern wird mir berichtet, daß ihr Browser während des uploads hängenbleibt (Sanduhr).
Ich hab auch schon gesehen, daß files nur teilweise hochgeladen werden, und dann natürlich korrupt sind.

Wo liegt der Fehler in meinem Ansatz? was hab ich übersehen?
Zusatzfrage: gibt es sicherheitsrelevante Aspekte, die ich übersehen habe?
Danke für Euere Hilfe.

Gruß Fritz

--
ss:| zu:) ls:[ fo:| va:) ch:? n4:& rl:? br:& js:| ie:| fl:|
  1. Moin Fritz,

    per html Formular (passwortgeschützt) kann mein user eine bereits

    Du hast 1 ganzen user? ;-)

    @copy($file, "$updir/$file_name");

    Der Befehl copy ist hier etwas unglücklich gewählt.

    Noch dazu direkt auf die bestehende Datei. Besser ist ein hochladen
    in ein build Verzeichniss mit einem anschliessenden moven auf das Ziel.

    Bei einem direkten Upload, so wie du das machst, wird zunächst
    die Datei neu angelegt ( mit Rechten für niemanden ). Sollte der
    Uploadstream abbreisen ( warum auch immer ) dann bleibt eine korrupte
    Datei zurück. Zumindest unter Unix / Linux.

    regds
    Mike

    1. Hallo,

      Du hast 1 ganzen user? ;-)

      und wenn ich mein Problem nicht löse, dann zerreisst es auch den noch :-)

      Der Befehl copy ist hier etwas unglücklich gewählt.

      Noch dazu direkt auf die bestehende Datei. Besser ist ein hochladen
      in ein build Verzeichniss mit einem anschliessenden moven auf das Ziel.

      Da hab ich ein Verständnisproblem:
      Ich dachte, der upload erfolgt _grundsätzlich_ in ein temp-Verzeichnis, und erst der copy-Befehl moved die Datei in mein Zielverzeichnis.
      Kann mir da mal jemand aufs Fahrrad helfen?

      Gruß Fritz

      --
      ss:| zu:) ls:[ fo:| va:) ch:? n4:& rl:? br:& js:| ie:| fl:|
      1. Moin,

        Ich dachte, der upload erfolgt _grundsätzlich_ in ein temp-Verzeichnis, und erst der copy-Befehl moved die Datei in mein Zielverzeichnis.

        genau hier ist dein Prob. Copy greift direkt auf das angegeben
        Verzeichniss und Datei zu. Es gibt keinen Automatismus, bei
        copy, von wegen upload in tmp und move.

        ich suche dir mal ein Script raus welches den Upload regelt.
        Allerdings ergibt die Prüfung auf existenz der Datei einen Fehler
        das musst du umbauen.

        regds
        Mike

        1. Hallo,

          Ich dachte, der upload erfolgt _grundsätzlich_ in ein temp-Verzeichnis, und erst der copy-Befehl moved die Datei in mein Zielverzeichnis.

          genau hier ist dein Prob. Copy greift direkt auf das angegeben
          Verzeichniss und Datei zu. Es gibt keinen Automatismus, bei
          copy, von wegen upload in tmp und move.

          Dann hab ich da irgendwas in der Doku falsch verstanden.

          ich suche dir mal ein Script raus welches den Upload regelt.

          Danke für das script. Hab mal kurz drübergeschaut: ist mir für meinen Zweck zu mächtig, und zu voluminös. Und ich hab bei scripts, die ich nicht selbst verbrochen habe, und ich jede einzelne Zeile verstehe, immer so ein ungutes Gefühl. Ich möchte lieber "selfen"
          Gruß Fritz

          --
          ss:| zu:) ls:[ fo:| va:) ch:? n4:& rl:? br:& js:| ie:| fl:|
          1. Hallo,

            Ich möchte lieber "selfen"

            Diese Einstellung gefaellt mir sehr! ;-)

            Deine Doku (oder ist es ein Buch?) ist offenbar veraltet.

            $file_name und copy() brauchte man frueher;
            heute gibt es $_FILES und move_uploaded_file()...

            Aktuelle Doku und Beispiele:

            dclp-FAQ: Wie funktioniert ein Datei-Upload über HTML-Formulare?
            http://www.dclp-faq.de/q/q-formular-upload-php4.html

            PHP-Manual: Steuerung von Dateiuploads
            http://www.php.net/manual/de/features.file-upload.php

            Gruesse,

            Thomas

            --
            Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
            Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
            Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
            1. Hallo,

              PHP-Manual: Steuerung von Dateiuploads
              http://www.php.net/manual/de/features.file-upload.php

              Genau, das ist es. Und da hatte ich auch meinen "Glauben" an das temp-dir her (und trotzdem weiterhin fest mit copy() geschrieben)
              "Standardmäßig werden Dateien in dem vorgegebenen temporären Verzeichnis des Servers gespeichert,..."
              Werd das jetzt mal so realisieren, und dann schaun mer mal ...

              Gruß Fritz

              --
              ss:| zu:) ls:[ fo:| va:) ch:? n4:& rl:? br:& js:| ie:| fl:|
      2. Moin,

        Kann mir da mal jemand aufs Fahrrad helfen?

        Ziehe Dir mal das und baue es um:

        http://www.palazo.net/fileupload13.zip

        regds
        Mike