[PHP] Probleem uploadscript met automatische mapnaam.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Pap3rclip
  • Registratie: Oktober 2006
  • Laatst online: 15-06 18:38
Beste Tweakers,

De bedoeling van het script is om bestanden te kunnen uploaden naar de webserver. Deze bestanden dienen in een map geplaatst te worden conform met de datum. (Vb.: foto.jpg vandaag uploaden moet worden geplaatst in: bestanden/121027/foto.jpg)

Maar ik kom er niet uit, het uploadscript werkt enkel als ik werk met een statisch genoemde map ipv. het dynamische yymmdd. Onderstaand script slaat het geuploade bestand nergens op, ook al wordt de echo met informatie over de upload wel weergegeven.

Ik heb dus een vermoeden dat het ergens aan het gebruik van $date ligt. Ik ken zelf niet al te veel van PHP dus graag jullie hulp hierbij.

Hieronder het script (script.php):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
$date = date("ymd");
$path = "bestanden/".$date."/";
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists($path . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      mkdir($path, 0777);
      move_uploaded_file($_FILES["file"]["tmp_name"],
      $path . $_FILES["file"]["name"]);
      echo "Stored in: " . $path . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?> 

Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 12-07 17:55
Zoals je hier kunt zien, is 'ymd' gewoon een geldige parameter.

Heb je ook al met error_reporting gespeeld? Staat die uit/aan?

edit:

Anyhow, het script lijkt bij mij gewoon te werken, dus wellicht een rechtenissue?

[ Voor 15% gewijzigd door C0rnelis op 27-10-2012 00:40 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
$_FILES["file"]["type"] komt van de client en is onbetrouwbaar.

Acties:
  • 0 Henk 'm!

  • Pap3rclip
  • Registratie: Oktober 2006
  • Laatst online: 15-06 18:38
C0rnelis schreef op zaterdag 27 oktober 2012 @ 00:33:
Zoals je hier kunt zien, is 'ymd' gewoon een geldige parameter.

Heb je ook al met error_reporting gespeeld? Staat die uit/aan?

edit:

Anyhow, het script lijkt bij mij gewoon te werken, dus wellicht een rechtenissue?
Het ziet er inderdaad een rechtenissue uit. Als ik bijvoorbeeld:
$path = "bestanden/" . $date . "/";

verander in

$path = "bestanden/";

Dan wordt het bestand wel gewoon geupload naar de map "bestanden". Doe ik de $date er weer tussen wordt de juiste map wel aangemaakt maar het geuploade bestand wordt er niet ingezet. De yymmdd map wordt op CHMOD 0755 gezet (ook al doe ik mkdir($path, 0777);). Via een ftp client is de 0755 eveneens niet te veranderen naar 0777.

Enig idee waarom ik wel de CHMOD van de map "bestanden" kan veranderen maar niet deze van de "yymmdd" mappen hierin?
GlowMouse schreef op zaterdag 27 oktober 2012 @ 00:37:
$_FILES["file"]["type"] komt van de client en is onbetrouwbaar.
Bedoel je dat dit onveilig is ivm. kwaadaardige uploads? Het uploadscript is voor de beheerders van de website en gaat alleen via een password protected pagina toegankelijk zijn dus dit zou geen probleem moeten vormen.

Acties:
  • 0 Henk 'm!

  • Pizzalucht
  • Registratie: Januari 2011
  • Laatst online: 14-07 20:32

Pizzalucht

Snotneus.

Heb je error/warning reporting aan staan?

En het is niet echt handig als iemand een PHP shell kan uploaden...
Ookal zit er een wachtwoord voor, het is altijd mogelijk dat iemand erin komt.

Acties:
  • 0 Henk 'm!

  • Pap3rclip
  • Registratie: Oktober 2006
  • Laatst online: 15-06 18:38
Heb een php file gemaakt met deze code:
PHP:
1
2
3
4
5
<?php
 error_reporting(E_ALL);
 ini_set("display_errors", 1);
 include("script.php");
?>

Als ik dan ga kijken krijg ik volgende errors:

Strict Standards: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CEST/2.0/DST' instead in /var/www/vhosts/xxx.be/httpdocs/NewsletterUpload/script.php on line 3

Notice: Undefined index: file in /var/www/vhosts/xxx.be/httpdocs/NewsletterUpload/script.php on line 6

Strict Standards: Only variables should be passed by reference in /var/www/vhosts/xxx.be/httpdocs/NewsletterUpload/script.php on line 6

Notice: Undefined index: file in /var/www/vhosts/xxx.be/httpdocs/NewsletterUpload/script.php on line 7

Notice: Undefined index: file in /var/www/vhosts/xxx.be/httpdocs/NewsletterUpload/script.php on line 8

Notice: Undefined index: file in /var/www/vhosts/xxx.be/httpdocs/NewsletterUpload/script.php on line 9

Notice: Undefined index: file in /var/www/vhosts/xxx.be/httpdocs/NewsletterUpload/script.php on line 10
Invalid file
--------------------

En ivm. het mogelijk uploaden van een php-shell, hoe is dit te vermijden?

Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Door PHP uit te schakelen voor die map. Maar het lijkt me sowieso geen al te best idee om mensen publiek toegankelijke mappen als uploaddoel te laten gebruiken... er zullen altijd nieuwe manieren komen om dat te misbruiken. Stel dat je PHP uitschakelt, maar SSI aan blijft staan, dan kunnen ze vast op die manier wel inbreken. Of misschien draait er wel ruby, perl or python. Of misschien een andere taal...

Externe mensen toestaan iets up te loaden wat de webserver dan mogelijk kan uitvoeren is altijd een slecht idee, en zeker als er geen tussenlaag bij zit.

Acties:
  • 0 Henk 'm!

  • Pap3rclip
  • Registratie: Oktober 2006
  • Laatst online: 15-06 18:38
Het zit zo: de eigenaars van een winkeltje in de buurt hier hebben een klantenlijst aan wie ze elke paar weken een nieuwsbrief sturen. Maar deze nieuwsbrief moet in de juiste map staan (yymmdd) zodat de backend van hun website deze oppikt en ze deze van daaruit kunnen versturen/verwijderen/... . Het probleem voor hun is dat ze niet voldoende kennis hebben om via een ftp client deze nieuwsbrieven op de juiste plaats te zetten. Dat wou ik dus vergemakkelijken met een php scriptje.

Zo zal het php script ook alleen toegankelijk zijn via hun met wachtwoord beveiligd backend. Ze zullen enkel nieuwsbrieven hiermee uploaden en mocht er dus iemand inbreken in de doelmap, zou dit geen ramp zijn omdat hier slechts wat nieuswbrieven instaan. Op deze manier is het toch redelijk veilig (althans voor een klein sieraden winkeltje) of zie ik nu nog steeds dingen over het hoofd? :P

Alvast bedankt voor de reacties.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 21:02
Maar om even op je script terug te komen, zo te zien bestaat $_FILES['file'] als index dus helemaal niet. Probeer eens alle indexen te achterhalen door middel van print_r om te kijken welke indexen in $_FILES wel bestaan.

Acties:
  • 0 Henk 'm!

  • Pap3rclip
  • Registratie: Oktober 2006
  • Laatst online: 15-06 18:38
PHP:
1
2
3
echo '<pre>';
   print_r($_FILES);
   echo '</pre>';

geeft als resultaat (bij uploaden willekeurige afbeelding):
code:
1
2
3
4
5
6
7
8
9
10
11
12
Array
(
    [file] => Array
        (
            [name] => colorful-pencils-1280-720-3560.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phplrPr3g
            [error] => 0
            [size] => 154912
        )

)

[ Voor 5% gewijzigd door Pap3rclip op 27-10-2012 03:06 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-07 14:45

Janoz

Moderator Devschuur®

!litemod

Volgens mij heeft je probleem helemaal niks te maken met het dynamisch zijn van de naam, maar met het feit dat in de ene situatie je slechts 1 map hebt ('a/') terwijl je in het tweede geval 2 mappen hebt ('a/b/'). mkdir kan maar 1 map aanmaken wanneer je niet aangeeft dat hij dit ook 'recursive' mag doen.

http://php.net/manual/en/function.mkdir.php

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 13-07 21:36
Daarnaast kijkt mkdir naar de umask van de huidige gebruiker. Mkdir 0777 wil dus niet altijd zeggen dat de dir ook op 0777 staat. Beter is het om dan nog een aparte chmod te doen.

Acties:
  • 0 Henk 'm!

  • Pap3rclip
  • Registratie: Oktober 2006
  • Laatst online: 15-06 18:38
Heb het gevoel dat de oplossing dichterbij aan het komen is. De juiste map wordt aangemaakt (yymmdd in bestanden) waarna ik
code:
1
chmod($path, 0777);

doe.
Heb nu echter ontdekt dat wanneer de yymmdd map wordt aangemaakt via het script, dat er geen bestanden in geplaatst kunnen worden, zelfs niet na een 0777 chmod en/of een ftp-programma (via Filezilla krijg ik Permission Denied).
Wanneer ik de map yymmdd aanmaak via Filezilla, werkt het script wel!

De oplossing ligt dus in het voorkomen dat er geen bestand gekopieerd/geplaatst kan worden in een map gemaakt door het script. Maak ik dezelfde map via een ftp-browser werkt alles perfect...

Edit: Misschien heeft het iets te maken met de owner/group die ik zie in Filezilla. Alle mappen en bestanden op de site zijn 10300/2522. Mappen aangemaakt door het script zijn van het type 48/48. Is er een mogelijkheid om mappen aan te maken met owner/group 10300/2522?

[ Voor 17% gewijzigd door Pap3rclip op 27-10-2012 20:48 ]


Acties:
  • 0 Henk 'm!

  • Blitzdoctor
  • Registratie: Januari 2012
  • Laatst online: 17-07 11:18

Blitzdoctor

Al belt u met een banaan...

Als je script de dir kan aanmaken en succesvol op 0777 kan zetten, moet je er ook files in kunnen plaatsen. Vaag. Het is niet de PHP safe mode die dwarsligt? Anders kan van wat ik google alleen extended file attributes nog in de weg zitten?

... Blitz komt er aan! | Battle.net: Blitzdoctor#1128 | FFXIV


Acties:
  • 0 Henk 'm!

  • Pap3rclip
  • Registratie: Oktober 2006
  • Laatst online: 15-06 18:38
Het was inderdaag PHP safe mode die opstond om een of andere reden. Bedankt voor de hulp!
Pagina: 1