[apache/php] Unable to create ... permission denied...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi alleen, ik ben bezig voor een klant met een script.. met het script verwerkt geuploade plaatjes en zet deze in de database en in een directory op de server van mijn klant.

maar ik krijg de volgende error
Warning: Unable to create './gfx/abstract/sig2datbanner.jpg': Permission denied in /home/virtual/site171/fst/var/www/html/test/adminedit.php on line 163

Warning: Unable to move '/tmp/phpe7MSsI' to './gfx/abstract/sig2datbanner.jpg' in /home/virtual/site171/fst/var/www/html/test/adminedit.php on line 163
nu moest ik volgens de beheerders van de webhoster (digitalus)

een tmp directory aanmaken waarin de 'geuploade' files opgeslagen zou moeten worden, deze staat nu overal met de rechten 777 (om te testen) maar niets werkt.

Ik kreeg van hun de volgende uitleg.
Ja, u heeft waarschijnlijk te maken met een safe mode restrictie
onderstaande tutorial hoe hier omheen te werken zal wel duidelijkheid geven omtrent wat er hier mis gaat bij u;

"Bestanden uploaden met safe mode aan

Velen hebben reeds het gemak ontdekt van het beheren van een site via de
webbrowser. Gewoon met je browser naar een administratiepagina, teksten
bijwerken, links toevoegen of verwijderen of bestanden uploaden en misschien
zelfs in een database plaatsen. Dat laatste is erg interessant, maar wordt
alleen lastig als safe mode aanstaat. Safe mode legt een aantal beperkingen
op aan PHP om de veiligheid van de server te kunnen waarborgen. Ook de
open_basedir restrictie wordt door veel providers gebruikt. Deze restrictie
zorgt ervoor dat programmeurs van PHP scripts geen bestanden kunnen
aanroepen buiten hun home directory. Iedereen zou anders in elkaars home
directory kunnen gaan neuzen. Normaal hoeft dit geen probleem te zijn,
totdat je gebruik gaat maken van het uploaden van bestanden via een
webbrowser.

Velen hebben het wel eens gedaan. Via een formulier in HTML een bestand naar
de webserver uploaden. Denk hierbij aan een pasfotootje voor je Yahoo!
profile. Wat er feitelijk gebeurt als je een bestand upload naar een
webserver is het volgende:

De webserver slaat het binnengekregen bestand op in de /tmp directory van de
server. In een speciale variable komt de naam te staan van dit bestand dat
de Apache webserver heeft aangemaakt.
Het script dat wordt aangeroepen door het formulier waarmee het bestand
ge-upload is krijgt deze variabele (met de naam van het bestand) door en kan
zo bijvoorbeeld het bestand open, inlezen in een variable en in een database
plaatsen.
Als het script klaar is met het bestand wordt het vanzelf door de server
verwijderd.

De oplettenden onder ons hebben al een probleem gesignaleerd. De apache
server plaatst het bestand in de /tmp directory. Als er een open_basedir
restrictie gebruikt wordt die de programmeur alleen in staat stelt bestanden
te gebruiken in de eigen home directory te gebruiken, is het niet mogelijk
om bestanden te openen in de /tmp directory. Dit zal ook leiden tot een
foutmelding.

Nu is daar gelukkig een oplossing voor! De functie move_uploaded_file. Deze
functie heeft twee parameters nodig: source file en destination. Het script
controleert of het bestand source file wel echt een bestand is dat via de
apache server is ge-upload. Als dat het geval is, verplaatst de functie het
bestand naar de opgegeven destination. Is het geen via apache ge-upload
bestand, dan doet de functie niets.

Nu even een praktijkvoorbeeld.

Eerst gaan we een pagina maken met daarin het formulier dat voor de upload
moet gaan zorgen. Hiervoor moet je wel een aantal speciale parameters aan de
FORM tag meegeven.

<form action="upload.php" method="post" enctype="multipart/form-data">

De enctype parameter is erg belangrijk. Zonder deze parameter gaat het
uploaden niet goed.
Ook moet je nog een speciale variabele meesturen met daarin de maximale
bestandsgrootte in bytes opgegeven.

<input type="hidden" name="MAX_FILE_SIZE" value="153600">

In dit geval accepteren we geen bestanden groter dan 150Kb. Nu moeten we nog
een INPUT tag gebruiken voor het selecteren van het te uploaden bestand.

<p>
Selecteer een bestand: <input type="file" name="myfile">
</p>

Nog een submit knop en het script is klaar.

<input type="submit">
</form>

We hebben in de FORM tag gezegd dat het script het bestand upload.php aan
moet roepen. We gaan dus nu beginnen met het script genaamd upload.php, dat
de daadwerkelijke verwerking van het ge-uploade bestand voor zijn rekening
neemt.

In dit geval ga ik het bestand in een MySQL database plaatsen. Ik heb al een
MySQL connectie aangemaakt, genaamd $db.

Wat we ook nodig hebben is een eigen tmp directory, in dezelfde directory
waar het upload script in staat. Maak deze aan, en geef iedereen alle
rechten in deze directory (chmod 777 tmp). Deze directory gaan we gebruiken
om het bestand tijdelijk in te plaatsen.
Ook moeten we even een unieke naam verzinnen voor het bestand. Het beste is
een 'random generated' naam. In het onderstaande voorbeeld maak ik een
bestansnaam die 4 tot 10 karakters lang mag zijn en alle kleine letters van
a t/m z kan bevatten.

$newfile = "tmp/";
for ($a = 0; $a < mt_rand(4,10); $a++) {
$newfile .= chr(mt_rand(97,122));
}

Nu hebben we een willekeurige naam gegenereerd en deze in de variable
$newfile geplaatst.
Nu gaan we het bestand van /tmp verplaatsen naar onze tmp directory.

move_uploaded_file($myfile,$newfile);

De $myfile variable komt overeen met de naam die we aan de INPUT tag in het
vorige script gegeven hebben. Het bestand staat nu in de tmp directory die
we net hebben aangemaakt, en is dus te gebruiken door ons script!

Nu lees ik de inhoud van het bestand in een variable in, en deze variable
komt in een veld van de database te staan.

$binarydata = addslashes(fread($newfile,"r"), filesize($newfile));
mysql_query("insert into files (binarydata) values ($binarydata)", $db);
unlink($newfile);

Nog even een unlink actie om het bestand te verwijderen (het zit nu toch in
de database!). Je hoeft natuurlijk niet per se het bestand in een database
te zetten. Je kunt ook een specifieke directory aanmaken en daar alle
ge-uploade bestanden in plaatsen. Zorg dan wel dat iedereen alle rechten
heeft in die directory (de user waaronder de apache server draait moet
namelijk kunnen schrijven in die directory). Hoe je dit verder moet
aanpakken laat ik over aan je eigen fantasie"
ik gebruik gewoon de move_uploaded_file($myfile,$newfile); en zou dus moeten werken volgens de text..

wie o wie kan me helpen, mijn klant wil zo graag zijn website online hebben..

[ Voor 3% gewijzigd door Verwijderd op 28-03-2003 06:45 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Heb je al gecontroleerd of de rechten voor je upload directory goed staan?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja alles :{ alles staat op 777 :'( ik en digitalus snappen er niets meer van :{

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nee daar komt een andere error aan de orde, deze heeft problemen met de permissie van het verplaatsen van de file van de tmp directory naar de target directory die bestaat..

Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
Als safemode of openbasedir restricties je php blocken krijg je meestal een melding in de trant van:
Safe Mode Restriction blabla
of
open base dir restriction in effect blablabla
Dus dat is het niet :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nee inderdaad, maar waar kan het dan aan liggen?

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Ik zie dat je een relatief pad gebruikt ( './gfx/abstract/sig2datbanner.jpg' ). Probeer het eens absoluut op te geven. Misschien verwijs op je op een of andere manier wel naar de verkeerde directory.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hoe bedoel je als ik vragen mag drm, dat ik de gehele path specificeer? :D

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Bij digitalus maken ze gebruiken van dedicated servers; dus als je gebruikt wil maken van upload en andere safe_mode functionaliteit als readdir() moet je altijd het volledige pad opgeven. Ik heb het probleem er ook gehad; readdir() e.d. wilde ook niet werken tot dat ik de volledige pad opgaf want als je ./ pakt het gedeelte waar het Php file instaat en die weet niet het virtueel is ofzo en neemt dus alleen /var/fst/* etc.:

code:
1
./test/plaatje.jpg


ipv

code:
1
/home/virtual/site171/fst/var/www/html/test/plaatje.jpg

Dat was bij iig het probleem bij Digitalus.

[ Voor 11% gewijzigd door alienfruit op 29-03-2003 21:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb nu de volgende error
Warning: SAFE MODE Restriction in effect. The script whose uid is 676 is not allowed to access /home/virtual/site171/fst owned by uid 0 in blaat.php on line 163
wat betekend dit nu? ik heb nu de structuur zoals alienfruit.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
onder linux/unix werk je met een bepaald rechtensysteem. Ook je script, wat door apache wordt uitgevoerd moet zich daar aan houden en behoort net als alle andere users toe aan een bepaalde groep. Die error meldt je dat je script (apache) - met userid 676 - onvoldoende rechten heeft om die directory /home/virtual/site171/fst te benaderen, die door een user met id 0 is gemaakt. Waarschijnljik behoren ze tot andere groepen. Als jij die directory bijvoorbeeld heb gemaakt terwijl je als root was ingelogd (wat volgens mij ook het geval is aangezien de userid 0 is - maar zo heel veel weet ik niet van linux dus misschien klets ik uit m'n nek), of zelfs via een ftp sessie, dan kun je daar problemen mee krijgen. Je kunt het waarschijnlijk oplossen door 'm 777 te chmodden. (vraag is of je dat wil)
Als je je script met een nieuwe directory wilt laten werken kun je het 't beste ook door een script aan laten maken

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb het even met een scriptje geprobeerd en heb de directory structuur verwijderd en kom er inderdaad achter dat me scripts geen bevoegdheden hebben op de server :?
Warning: mkdir() failed (Permission denied) in /home/virtual/site171/fst/var/www/html/test/makedirs.php on line 2

Warning: Unable to access ./gfx/animals in /home/virtual/site171/fst/var/www/html/test/makedirs.php on line 3
:'( dus de admin zou mijn scripts rechten moeten geven? :D

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
iemand svp? :'(

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
om directories te kunnen maken moet de directory waarin je die directory maakt wel 777 gechmod zijn. check dat even

Acties:
  • 0 Henk 'm!

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:09
Probeer dit eens:
De tempdirectory moet wel 777 zijn, verder niets...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$filetype=$_FILES['imagefile']['type'];
$name=$_FILES['imagefile']['name'];
$size=$_FILES['imagefile']['size'];
$tempfile=$_FILES['imagefile']['tmp_name'];
$tempsavefile="files/$name";

move_uploaded_file ($tempfile, $tempsavefile) 
     or die ("Could not copy uploaded file to temp dir");
$data = addslashes(fread(fopen($tempsavefile, "r"), $size));
$this->query("INSERT INTO Data(Imagefield) VALUES ('$data')");
unlink ($tempsavefile) 
     or die("Could not delete temporary uploaded file");

[ Voor 32% gewijzigd door Digihelp ® op 30-03-2003 16:39 . Reden: layout ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
marty schreef op 30 March 2003 @ 15:32:
om directories te kunnen maken moet de directory waarin je die directory maakt wel 777 gechmod zijn. check dat even
klopt maar zelfs die directory maak ik aan... voorbeeld ;)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/animals", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/nature", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/town&city", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/equipment", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/abstract", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/closeup", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/expressive", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/flowers", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/people", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/blackwhite", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/towncity", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/travel", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/various", 0777);
mkdir("/home/virtual/site171/fst/var/www/html/test/gfx/animals", 0777);
?>


de 1e geeft de create error :{

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
dan moet je dus zorgen dat test ook 777 gechmod is
... is toch niet zo heel moeilijk te bedenken :?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nee dat werkt dus ook niet, net ff uitgetest :'(

Acties:
  • 0 Henk 'm!

  • Tom-Eric
  • Registratie: Oktober 2001
  • Laatst online: 25-03 09:11
Misschien kan hij niet de rechten van de directory wijzigen, omdat het php script niet de owner is van de onderliggende directory (test)?

i76 | Webdesignersgids | Online Gitaarlessen & Muziekwinkels


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
de rechten van de test dir heb ik veranderd naar 776 ofzo... dat kon ik zelf wel veranderne maar idd mijn scripts hebben geen rechten wat so ever...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
:'( wat betekend dit nu weer :? ze hebben weer wat rechten aangepast..

code:
1
2
3
Warning: SAFE MODE Restriction in effect. The script whose uid is 676 is not allowed to access /home/virtual/site171/fst owned by uid 0 in /home/virtual/site171/fst/var/www/html/test/adminedit.php on line 163

Warning: Cannot add header information - headers already sent by (output started at /home/virtual/site171/fst/var/www/html/test/adminedit.php:163) in /home/virtual/site171/fst/var/www/html/test/adminedit.php on line 176


:'(

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
mijn excuus drm, ik wist niet dat dit veel met php te maken had.

ik heb dit echter gevonden
safe_mode_gid boolean
By default, Safe Mode does a UID compare check when opening files. If you want to relax this to a GID compare, then turn on safe_mode_gid. Whether to use UID (FALSE) or GID (TRUE) checking upon file access.
Ik snap niet geheel waar dit opslaat? waarschijnlijk bevind het probleem zich in iets dat met dit commando opgelost kan worden... :? weet iemand precies wat dit commando doet?

ik heb nu de directories die aangemaakt moesten worden wederom aangemaakt maar we zijn weer bij het begin, ik snap het niet en wil het ook niet meer snappen..

Mijn klant moet het maar regelen met Digitalus want ziek word ik van hun korte reacties en weinige hulp :r

[ Voor 100% gewijzigd door Verwijderd op 02-04-2003 19:31 ]

Pagina: 1