webForumDet fria alternativet

file upload och safe mode

13 svar · 521 visningar · startad av Tinwëlint

TinwëlintMedlem sedan maj 2004451 inlägg
#1

När man laddar upp filer med hjälp av POST placeras de i tmp på servern (verkade i och för sig vara någon plats som hette owner på mitt webhotell). När då safe mode är aktiverat tillåts man inte flytta (eller kopiera) filen därifrån till den plats där man vill ha den med move_uploaded_file() eller copy().
Det är vad jag har råkat ut för.
Någon som vet om det finns något kryphål?
Kan man be webbhotellet göra något?

PeddaMedlem sedan juni 20006 032 inlägg
#2

När safe mode är påslaget så kontrollerar PHP om filen/filerna/katalogen du försöker använda har samma ägare som scriptet som exekveras. Det du även kan testa med är att du sätter ut hela sökvägen till mappen du ska ladda upp till.

/r tänkte helt fel. :r

Kör själv med safe mode på och har inga problem. Du har väl satt CHMOD så du har skrivrättigheter till mappen?

TinwëlintMedlem sedan maj 2004451 inlägg
#3

Jo, jag vet och det är precis det som är problemet. För som jag förstår det måste filer som laddas upp med http-post placeras i någon slags tmp-mapp. Och på mitt webbhotell är det inte jag som är ägare till den. Så skriptet verkar inte ha några rättigheter alls till filerna som placeras där.
Ett tips jag annars läste var att problemet skulle vara att man inte tilläts ta bort filerna och då istället för move_uploaded_file() kunde använda copy(). Men det gjorde ingen skillnad. Fortfarande:

PHP skrev:

Warning: copy(): SAFE MODE Restriction in effect. The script whose uid is 90005 is not allowed to access / owned by uid 0 in (skriptfilen)

Den mappen (root) kan jag givetvis inte heller sätta CHMOD på.

PeddaMedlem sedan juni 20006 032 inlägg
#4

copy funkar inte under safe mode men det ska däremot move_uploaded_file göra.
Har du testat med att ändra sökvägen?

PeddaMedlem sedan juni 20006 032 inlägg
#5

Hjärnan funkar inte så bra när man är trött. ;)

Du kan inte skriva till root utan du får spara bilderna i en mapp du själv har skapat så funkar det.

TinwëlintMedlem sedan maj 2004451 inlägg
#6

Ja. Men hur ska jag spara till en av mina egna mappar.
Filen laddas ju upp med http-post på det sätt som beskrivs här.

http://php.net/features.file-upload

Kan jag på något sätt bestämma att filen ska hamna direkt i den mapp jag vill? Annars verkar det ju som sagt vara så att den måste hamna i serverns tmp-mapp till att börja med.

PeddaMedlem sedan juni 20006 032 inlägg
#7

Om du kollar i exemplet i manualen så sätter de målmappen med
$uploaddir = '/var/www/uploads/';

tmp mappen är webbhotellets inställning som du inte behöver bry dig om, där hamnar alla filer du laddar upp först, sen flyttas dom till den mapp du själv väljer.

TinwëlintMedlem sedan maj 2004451 inlägg
#8

Ja men $uploaddir i exemplet i dokumentationen är ändå bara vart filen ska flyttas (med move_uploaded_file) efter att den har laddats upp . Innan dess kommer den att placeras i en tmp-mapp. Och som sagt kan jag inte använda move_uploaded_file på det sättet eftersom jag inte har tilräckliga rättigheter för tmp-mappen.

r:

... sen flyttas dom till den mapp du själv väljer.

Det är just det jag måste göra med mitt skript och just det jag inte tillåts på de sätt jag har provat.

MatteMedlem sedan aug. 20002 975 inlägg
#9

Om du inte har rättigheter att hämta från temp-katalogen har de något fel på inställningarna på webservern.

Jag har kört på flera webbhotell med safe_mode satt, använt move_uploaded_file(), och har aldrig haft några problem med rättigheter.

Hur ser den kod ut du använder ?

TinwëlintMedlem sedan maj 2004451 inlägg
#10

Min html-form:

<form enctype="multipart/form-data" id="form1" method="post" action="">

Ett gäng text-inputs som ska sparas i databasen

<p>
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<input name="userfile" type="file" id="fil" size="50" maxlength="255" />
<label for="fil">Filnamn (max 255 tecken)</label>
</p>

<div>
<input type="hidden" name="action" value="insert_db" />
</div>

<p>
<button type="submit" name="Submit">Spara</button>
</p>

</form>

Och koden som tar emot det postade (bara filen här):

$uploaddir = "/resultat/";
		$uploaduserfile = $uploaddir . basename($_FILES['userfile']['name']);
		if (move_uploaded_file($_FILES['userfile']['tmp_name']}, $uploaduserfile")) {
		   echo "<p>Filen laddades upp! 

några sql-frågor osv.

Problemet verkar vara att filen med hjälp av http-post tillfälligt placeras i mappen "/" (och inte tmp, men det är kanske där filerna borde hamna ändå) på webhotellet. Och den får jag inte komma åt med min move_uploaded_file.

PeddaMedlem sedan juni 20006 032 inlägg
#11

Gjorde några justeringar och nu funkar det hos mig iaf.

<form enctype="multipart/form-data" id="form1" method="post" action="test2.php">

Ett gäng text-inputs som ska sparas i databasen

<p>
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<input name="userfile" type="file" id="file" size="50" maxlength="255" />
<label for="fil">Filnamn (max 255 tecken)</label>
</p>

<div>
<input type="hidden" name="action" value="insert_db" />
</div>

<p>
<button type="submit" name="Submit">Spara</button>
</p>

</form>
<?php 
$uploaddir = "resultat/";
$uploaduserfile = $uploaddir . basename($_FILES['userfile']['name']);

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaduserfile)) {
	echo "<p>Filen laddades upp!</p>";
} 
?>
TinwëlintMedlem sedan maj 2004451 inlägg
#12

:)

Tja, att jag hade en oavslutat if-sats var inte direkt problemet. Det där var bara lite snabbt och slarvigt urklippt från min kod. Den där satsen avslutas korrekt.

Vad som däremot utgjorde ett problem var att jag hade:
$uploaddir = "/resultat/";

Jag tänkte: Documentroot/resultat/ , där ska de hamna

Servern tänkte Serverroot/resultat/ , den har du inte rättigheter till din busunge.

Jag tänkte om:
$uploaddir = "../resultat/";

Allt fungerade precis som det skulle, jag kände mig ganska fånig.

PeddaMedlem sedan juni 20006 032 inlägg
#13

Huvudsaken är att det löste sig. :)

UrMeMedlem sedan apr. 2001762 inlägg
#14

EDIT: Eller glöm det jag skrev hade gjort en slarvigt stavfel ;)

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)