Steffi: File upload - funktioniert, allerdings kann Browser nicht lesen

Hallo,

zugegeben bin ich PHP-Anfänger, fällt mir aber nicht schwer, da ich beruflich ASP-Profi bin. Dennoch gibt es manche Hürde auf Apache Servern für mich, die es mit dem IIS nicht gibt (bzw. anderweitig komplizierter ist ;-)

Mein aktuelles Problem:
Ich habe mir eine Funktion für einen File-Upload geschrieben. Diese funktioniert soweit perfekt, sprich die hochgeladene Datei liegt dann genau dort, wo ich sie haben möchte.

ALLERDINGS: Wenn ich per Browser diese Datei (z.B. ein Bild) aufrufe, bekomme ich einen Fehler "Zugriff verboten, Error 403" (wenn ich die Datei per FTP öffne, dann kann ich sie ohne weiteres lesen)
ERGO: Rechte Problem. Aber auch da habe ich mich schlau gemacht, und die Rechte des hochgeladenen Files per "chmod($file,0777)" (die 0777 zumindest nur temporär für den Test) verändert.
TROTZDEM: Gleicher Fehler. Ich kann die Rechte des hochgeladenen Files also nicht per chmod ändern?!?!?!

Ihr seht, ich kümmer mich um die Sachen, bevor ich diverse Forums-Einträge hinterlasse...
Kann mir jemand weiterhelfen, hat mich schon 3 Tage an "suchen und informieren" gekostet?

Anbei mal meine Funktion:

function uploaddata($saveDir,$fileNameNew) // ist $fileNameNew = "", so wird der alte Name hergenommen
{
$saveDirectory = $saveDir;
$tempName = $_FILES['dokument']['tmp_name'];
$fileName = $_FILES['dokument']['name'];
$extName = strrchr($fileName, ".");
if ($fileNameNew == "")
  $fileName2 = $fileName;
else
$fileName2 = $fileNameNew.$extName;

// Sicherstellen, dass keine unerlaubten Dateien hochgeladen werden
if ($extName == '.doc' || $extName == '.pdf' || $extName == '.txt' || $extName == '.xls' || $extName == '.ppt' || $extName == '.jpg' || $extName == '.gif' || $extName == '.zip'  ) //erlaubte Dateien
{
  if (move_uploaded_file($tempName, $saveDirectory . $fileName2))
  {
   echo 'Datei erfolgreich hochgeladen!<p>';
  }
  else
  {
   echo 'Es ist ein Fehler beim Datei-Upload aufgetreten.<br>';
   $fileName2 = "";
  }
}
else // Dateityp nicht erlaubt
echo "Dieser Dateityp darf aus Sicherheitsgründen nicht auf den Server geladen werden!";

chmod($saveDirectory . $fileName2,O777); // nur zum Testen, später 0644

$returnFileName = $fileName2;
return ($returnFileName);
}

  1. Hello,

    // Sicherstellen, dass keine unerlaubten Dateien hochgeladen werden
    if ($extName == '.doc' || $extName == '.pdf' || $extName == '.txt' || $extName == '.xls' || $extName == '.ppt' || $extName == '.jpg' || $extName == '.gif' || $extName == '.zip'  ) //erlaubte Dateien

    Das ist nicht ungefährlich.
    Bentutze lieber eine Funktion, die den tatsächlichen Mime-Type ermittelt. Musst Du hier mal das Archiv nach "mime_content_type" durchsuchen.

    if (move_uploaded_file($tempName, $saveDirectory . $fileName2))

    Liegt das $saveDirectory innerhalb der Dokument-Root des HTTP-(Virtual)-Hosts?
    Denn Du hast ja kein direktes Rechte-Problem innerhalb eines Dienstes, sondern ein Dienste-Problem. Der Dinest als solches darf hier nicht zugreifen.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hi Tom,

      danke für den Tip, das werde ich tun... (hab auch schon darüber gelesen...)

  2. Hallo,

    chmod($saveDirectory . $fileName2,O777); // nur zum Testen, später 0644

    Kann es sein, dass diese Null in Wahrheit ein "O" (Der Buchstabe nach dem "N" im Alphabet) ist?

    Gruß,
    Severin

    --
    They that can give up essential liberty to obtain a little temporary safty deserve neither liberty nor safty.
    -- Benjamin Franklin
    1. Hi Severin,

      oh je...
      Da programmiert man seit 7 Jahren Webseiten und dann so ein Fehler!!!
      Du hast den Nagel auf den Kopf getroffen... Das mit der "Betriebsblindheit", wenn man seit Tagen auf ein Skript stiert, stimmt anscheinend wirklich!

      Meine Funktion "funktioniert" nun wie geschmiert!!!

      Wie kann ich das bei Dir wieder gutmachen?

      Vielen Dank,
      Steffi

      1. echo $begrüßung;

        Da programmiert man seit 7 Jahren Webseiten und dann so ein Fehler!!!

        Mit error_reporting auf E_ALL gesetzt wäre das nicht passiert. Dann hätte es eine Notice gegeben, die dich hätte stutzen lassen können.

        echo "$verabschiedung $name";

      2. Hallo,

        Wie kann ich das bei Dir wieder gutmachen?

        Es freut mich, dass ich dir helfen konnte :-) Mir ist dieser "Fehler" besonders aufgefallen, weil ich ihn selbst schon einmal gemacht habe ;-)

        Aber beherzige dedlfix Tipp; wenn du auf deinem Entwicklungssystem das Error_reporting auf E_ALL setzt zeigt dir PHP solche Sachen an.

        Gruß,
        Severin

        --
        They that can give up essential liberty to obtain a little temporary safty deserve neither liberty nor safty.
        -- Benjamin Franklin
  3. Nur noch eine allgemeine Nachfrage (da ich ja wie gesagt mit PHP noch nicht ganz so fit bin, was die ganze Umgebung und Sicherheiten betrifft):

    Kann man die Fkt. so lassen? Das mit dem "lieber Mime-Type als extension" überprüfen habe ich mir bereits zu Herzen genommen.

    Ist sie halbwegs sicher? Oder kann man daran noch etwas verbessern?

    Nochmals Danke!
    Echt ein tolles Forum hier!

    Steffi