Uploadscript (Probleme mit der umsetzung)

cyberking

Grünschnabel
heyho...

ich habe ein kleines problemchen... zuerst erkläre ich am besten mal, was das script leisten soll, und was es bisher kann.

also, ich habe mir aus x tutorials ein uploadscript zusammengeschnippelt, welches 2 dateien zur selben zeit uploaden soll. hierbei handelt es sich 1. um eine zip datei, und 2. um einen screenshot (es geht um skins...).
beim upload soll ein neuer ordner erstellt werden, der den namen des skins hat. in diesen ordner sollen nun die beiden dateien upgeloadet werden, also das zip, und der screenshot dazu. weiterhin soll das script eine mail an eine deifinierte e-mail adresse schicken, um über neue uploads informiert zu werden.

was geht:
- verzeichnis erstellen
- e-mail versenden

was nicht geht:
- upload

der code:
PHP:
<?PHP
$addi = "contact@growers.de";
$message = "$name [ $email ] hat einen neuen skin upgeloadet.";
$tellnew = "1";
$mode = 0777;
$skingesamt=$skinname."/".$file_name;
if (!file_exists($skinname))
  {
   mkdir ($skinname,$mode);
   copy($zip, $skingesamt);
   copy($screenshot, $skingesamt);
   unlink($zip);
   unlink($screenshot);
  }
else
  echo "Ein Skin mit diesem namen existiert bereits...";
if ($tellnew == "1")
  {
   mail("$addi", "Uploaded file", "$message");
   exit;
  }
?>


und (wen es interessiert) hier noch der code des dazugehörigen formulares:

PHP:
<html>
<head>
<title>script: Skinupload</title>
</head>

<body>

<center>
<form method="post" action="upload.php">
<table border="0" width="650">
  <tr>
    <td width="120"><p align="left">(Nick)Name: </p></td>
    <td width="12"><font color="red"><b>*</b></font></td>
    <td width="500" colspan="2">
      <input name="name" size="20">
    </td>
  </tr>
  <tr>
    <td width="120"><p align="left">E-Mail Adresse: </p></td>
    <td width="12">&nbsp;</td>
    <td width="500" colspan="2">
      <input name="mail" size="20">
    </td>
  </tr>
  <tr>
    <td width="120"><p align="left">Skin-Name: </p></td>
    <td width="12"><font color="red"><b>*</b></font></td>
    <td width="500" colspan="2">
      <input name="skinname" size="20">
    </td>
  </tr>
  <tr>
    <td width="120"><p align="left">Skin Zip: </p></td>
    <td width="12"><font color="red"><b>*</b></font></td>
    <td width="500" colspan="2">
      <input name="zip" size="20" type="file">
    </td>
  </tr>
    <tr>
    <td width="120"><p align="left">Screenshot: </p></td>
    <td width="12"><font color="red"><b>*</b></font></td>
    <td width="500" colspan="2">
      <input name="screenshot" size="20" type="file">
    </td>
  </tr>
    <tr>
    <td width="120" valign="top"><p align="left">Beschreibung: </p></td>
    <td width="12" valign="top"><font color="red"><b>*</b></font></td>
    <td width="500" colspan="2">
      <textarea rows="6" cols="36" name="description" wrap="physical"></textarea>
    </td>
  </tr>
  </tr>
  <tr>
    <td colspan="4" height="50">
      <input type="submit" value="hoch damit">&nbsp;&nbsp;&nbsp;<input type="reset" value="Zurücksetzen">&nbsp;&nbsp;&nbsp;&nbsp;
    </td>
  </tr>
</table>

</form>
</center>
</body>
</html>

hier die fehlermeldungen:


Warning: Unable to create 'huhu2/': Is a directory in /var/www/html/uploader/upload.php on line 10

Warning: Unable to create 'huhu2/': Is a directory in /var/www/html/uploader/upload.php on line 11

Warning: Unlink failed (Permission denied) in /var/www/html/uploader/upload.php on line 12

Warning: Unlink failed (Permission denied) in /var/www/html/uploader/upload.php

wäre dankbar für hilfe :)
 
Zuletzt bearbeitet:
Vielleicht solltest du mit $_files["dateinname"] damit könnte es evtl klappen. Die Variable $file_name ist undefiniert, deswegen "glaubt" PHP die Variable $skingesamt sei ein Ordner, da der Wert nur "huhu2/" und nicht wie erwartet "huhu2/huhu2.zip" enthält.
 
hi, habe es nun anders gelöst, bzw besser gesagt korrigiert.

allerdings gibt es da ein kleines "sicherheitsloch", welches ich noch stopfen müsste... wenn $skinname zum beispiel ../../blabla eingibt, dann wird das verzeichnis halt 2 ebenen höher erstellt. jemand eine idee, wie man das umgehen kann?

hier noch der aktualisierte "code"

PHP:
<?PHP

$mailto = "contact@growers.de";
$message = "$name [ $mail ] hat einen neuen skin namens $skinname upgeloadet. Screenshot: http://www.growers.de/skins/$skinname/$screenshot_name";
$tellnew = "1";
$mode = 0777;
$infos = " Name: $name\n e-mail: $mail\n Skinname: $skinname\n Skinzip: $zip_name\n Screenshot: $screenshot_name\n URL zum Screenshot: http://www.growers.de/skins/$skinname/$screenshot_name\n URL zum ZIP-File: http://www.growers.de/skins/$skinname/$zip_name\n Beschreibung: $description";


if ($name != "" || $description != "" || $skinname != "" || $zip != "" || $screenshot != "")
  {
   if (!file_exists($skinname))
      {
       mkdir ($skinname,$mode);
        if ($zip_name != "" || $screenshot_name != "" || $skinname != "")
         {
          copy("$zip" , "$skinname/$zip_name");
          copy("$screenshot" , "$skinname/$screenshot_name");
	  touch("$skinname/infos.txt");
	  $infodatei = fopen("$skinname/infos.txt", "w");
	  fputs($infodatei, $infos);
	  fclose($infodatei);
          echo "Danke $name, wir haben den Skin $skinname erhalten.";
         }
          else
           {
            die("Nicht alle Felder ausgefüllt!");
           }
      }
   else
    {
     echo "Ein Skin namens $skinname existiert bereits!";
    }
  }
else
  {
   echo "Nicht alle felder ausgefüllt!";
  }

if ($tellnew == "1")
  {
   mail("$mailto", "Neuer Skin", "$message");
   exit;
  }
?>


und thx für's helfen.
 
Also ich kann dir keinen code bieten, aber ne theoretische Lösung für das Problem.
Es gibt einen Stringbefehl, der nach dem letzten vorkommen eines Zeichens sucht in einem String.
eine pfadbezeichung wird ja mit " / " beendet. Dann schreibst du einen code, der dann in diesem string alles löscht bis zum letzten vorkommen des backslashes.
Reicht das? Ich hoffe!

Achso noch was die fehler die da ausgegeben werden müssten daher kommen, weil der chmod nicht richtig eingestellt ist von den pfaden, denke ich mal.
Wenn du nen neuen pfad erstellst, dann musst du uach gleichzeitig per php den chmod ändern, bevor du die file hochlädst.
dann müssten uach die fehlermeldungen wegbleiben!
 
mach am besten nen preg-pattern der punkte und striche einfach entfernt. quasi so:

$skinname = preg_replace("/(\.\.\/)*/","",$skinname);

das sucht nach ../ und ersetzt sie durch einen leeren string. ich weiß nicht wie das verhalten ist wenn du nach dem letztvorkommenden / suchst, aber falls es kein / gibt, dürfte er reintheoretisch gar nichts ausspucken, deswegen ist preg-replace besser, da er nur das ersetzt was der pattern findet. im grunde müssteste nur die zeile da oben bei dir einfügen...
 
hi,

ja, thx, habe es auch so gemacht... bzw ähnlich. ausserdem noch alles ein wenig verkürzt, dank freundlicher hilfe.

@Razorhawk, der CHMOD wird doch direkt beim verzeichnis erstellen auf 0777 gesetzt:

PHP:
<?
$mode = 0777;
mkdir($skinname,$mode);
?>

oder sehe ich das falsch?


so, und nun letzten endes ist das folgende bei rausgekommen, ich denke, es wäre dann soweit erstmal fertig, zumindest funktioniert es so, wie ich wollte... wenn noch jemandem sicherheitsmängel auffallen, möge er mir bitte bescheidgeben :) thx

PHP:
<?PHP
$skinname = ereg_replace("/" , "0" , $skinname);
$skinname = ereg_replace(" " , "_" , $skinname);
$mode = 0777;
$tellnew = "0";
$mailto = "contact@growers.de";
$message = "$name [ $mail ] hat einen neuen skin namens $skinname upgeloadet. Screenshot: http://www.growers.de/skins/$skinname/$screenshot_name";
$infos = " Name: $name\n e-mail: $mail\n Skinname: $skinname\n Skinzip: $zip_name\n Screenshot: $screenshot_name\n URL zum Screenshot: http://www.growers.de/skins/$skinname/$screenshot_name\n URL zum ZIP-File: http://www.growers.de/skins/$skinname/$zip_name\n URL zur infos.txt: http://www.growers.de/skins/$skinname/infos.txt\n Beschreibung: $description";
if ($skinname != "" and $skinname !="" and $name != "" and $zip != "none" and $screenshot != "none" and $description != "" and !file_exists($skinname) and $screenshot_type == "image/jpeg")
  {
   mkdir ($skinname , $mode);
   copy("$zip" , "$skinname/$zip_name");
   copy("$screenshot" , "$skinname/$screenshot_name");
   touch("$skinname/infos.txt");
   $infodatei = fopen("$skinname/infos.txt", "w");
   fputs($infodatei , $infos);
   fclose($infodatei);
   echo "Danke $name, wir haben deinen Skin ($skinname) erhalten.<br><br>\n";
   echo "Wir werden ihn nach einer kurzen Prüfung in unser Archiv aufnehmen.";
  }
else
  {
   echo "<font color=\"red\"><h3>Es ist ein Fehler aufgetreten.</h3></font><br><br>\n";
   echo "Entweder existiert bereits ein Skin namens <b>$skinname</b>,<br>\n";
   echo "oder es wurden <b>nicht alle Pflichtfelder</b> ausgefüllt.<br><br>\n";
   echo "Denke bitte auch daran, dass nur <b>*.zip</b> bzw <b>*.jpg</b> Dateien<br>\n";
   echo "hochgeladen werden können...";
   exit;
  }
if ($tellnew == "1")
  {
   mail("$mailto", "Neuer Skin...", "$message");
   exit;
  }
else
  {
   exit;
  }
?>
 
Zurück