/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
.htaccess ødelægger upload - hvad gør man?
Fra : Jakob Munck


Dato : 07-07-06 11:47

Jeg har lavet et lille galleri, hvor alt virker udmærker, lige indtil det
bliver installeret på en site, hvor der er en .htaccess-fil. Så virker
upload ikke mere. Jeg vil nødig slette .htaccess, da den har nogle nyttige
funktioner (husker ikke p.t. hvad), så der skal nok skrives noget mere i
den.

Min .htaccess ser sådan ud:
----------------------------------------------
<Files ".ht*">
deny from all
</Files>

php_flag register_globals 0
------------------------------------------------------

Min uploadfil, som behandler data fra formen, og som virker fint uden
..htaccess, ser sådan ud:
------------------------------------------------------
<body bgcolor="#ffffff" text="#000000" link="#0000ff" vlink="#800080"
alink="#ff0000">
<?
$add="img_store/$userfile_name"; // the path with the file name where the
file will be stored, upload is the directory name.
if(move_uploaded_file ($userfile, $add)){
echo "Billedet er oploadet";
chmod("$add",0777);

}else{

echo "<br><br><br><br><br><br><br><center>";
echo "Der gik noget galt, filen blev ikke uploadet";
echo "<br><br><br><br><br>";
echo "<a href='index.php' class='normal'>Start</a>";
echo "</center>";

exit;}

///////// Start the thumbnail generation//////////////
$n_width=100; // Fix the width of the thumb nail images
$n_height=100; // Fix the height of the thumb nail imaage

$tsrc="img_thumb/$userfile_name"; // Path where thumb nail image will be
stored
echo $tsrc;
if (!($userfile_type =="image/pjpeg" OR $userfile_type=="image/gif")){echo
"Filen skal være i .jpg eller .gif format!<BR>";
exit;}
/////////////////////////////////////////////// Starting of GIF thumb nail
creation///////////
if (@$userfile_type=="image/gif")
{
$im=ImageCreateFromGIF($add);
$width=ImageSx($im); // Original picture width is stored
$height=ImageSy($im); // Original picture height is stored
$newimage=imagecreatetruecolor($n_width,$n_height);
imageCopyResized($newimage,$im,0,0,0,0,$n_width,$n_height,$width,$height);
if (function_exists("imagegif")) {
Header("Content-type: image/gif");
ImageGIF($newimage,$tsrc);
}
elseif (function_exists("imagejpeg")) {
Header("Content-type: image/jpeg");
ImageJPEG($newimage,$tsrc);
}
chmod("$tsrc",0777);
}////////// end of gif file thumb nail creation//////////

////////////// starting of JPG thumb nail creation//////////
if($userfile_type=="image/pjpeg"){
$im=ImageCreateFromJPEG($add);
$width=ImageSx($im); // Original picture width is stored
$height=ImageSy($im); // Original picture height is stored
$newimage=imagecreatetruecolor($n_width,$n_height);
imageCopyResized($newimage,$im,0,0,0,0,$n_width,$n_height,$width,$height);
ImageJpeg($newimage,$tsrc);
chmod("$tsrc",0777);
}
//////////////// End of JPG thumb nail creation //////////
header("Location: galleri_vis.php");
ob_end_flush();
?>
-----------------------------------------------------------------

Hvad kan jeg gøre for at få upload og .htaccess til at leve med hinanden, så
galleriet virker?

v.h.
Jakob



 
 
Michael Zedeler (07-07-2006)
Kommentar
Fra : Michael Zedeler


Dato : 07-07-06 12:25

Jakob Munck wrote:
> Jeg har lavet et lille galleri, hvor alt virker udmærker, lige indtil det
> bliver installeret på en site, hvor der er en .htaccess-fil. Så virker
> upload ikke mere. Jeg vil nødig slette .htaccess, da den har nogle nyttige
> funktioner (husker ikke p.t. hvad), så der skal nok skrives noget mere i
> den.
>
> Min .htaccess ser sådan ud:
> ----------------------------------------------
> <Files ".ht*">
> deny from all
> </Files>
>
> php_flag register_globals 0

Her er oversigten over direktiver til Apache:

http://httpd.apache.org/docs/2.0/mod/quickreference.html

Files-direktivet finder du her:

http://httpd.apache.org/docs/2.0/mod/quickreference.html#F

Og PHPs Apache-spefikke funktioner finder du her:

http://dk2.php.net/apache

samt her:

http://dk2.php.net/manual/en/configuration.changes.php#configuration.changes.apache

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Jakob Munck (07-07-2006)
Kommentar
Fra : Jakob Munck


Dato : 07-07-06 14:46

> Her er oversigten over direktiver til Apache:
>
> http://httpd.apache.org/docs/2.0/mod/quickreference.html
>
> Files-direktivet finder du her:
>
> http://httpd.apache.org/docs/2.0/mod/quickreference.html#F
>
> Og PHPs Apache-spefikke funktioner finder du her:
>
> http://dk2.php.net/apache
>
> samt her:
>
> http://dk2.php.net/manual/en/configuration.changes.php#configuration.changes.apache
>
> Mvh. Michael.

Mange tak. Jeg opgav at læse alt dette igennem, og eksperimenterede lidt i
stedet. Det løste problemet. Man sætter bare en .htaccess fil i den mappe,
som galleriet er i. Den overkriver rod-htaccess. Og i galleri-acces sletter
man alt andet end netop den linie, som giver problemet. Og i denne linie
ændres værdien, således:

php_flag register_globals 1

Bemærk, værdien er sat til 1 i stedet for 0, som anvendes i rod-htaccess. Så
er der skriveadgang til mappen. Men om problemet kunne være løst på en bedre
måde, ved jeg ikke. Hvis der er forslag, hører jeg gerne disse. Men nu
virker det.

v.h.
Jakob



Bertel Lund Hansen (07-07-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 07-07-06 18:24

Jakob Munck skrev:

> php_flag register_globals 1

> Bemærk, værdien er sat til 1 i stedet for 0, som anvendes i rod-htaccess. Så
> er der skriveadgang til mappen. Men om problemet kunne være løst på en bedre
> måde, ved jeg ikke.

Det er en sikkerhedsfordel at register_globals er 0.

Jeg har ikke nærlæst din kode, men her er et eksempel der vil
fejle hvis register_globals er 0:

=========
<?
if ($test=='Fortsæt') gørnogetsmart();
?>

<form action="<?=$_SERVER['PHP_SELF']?>" method='post'>
<select name='test'>
<option>Slut
<option>Fortsæt
</select>
</form>
=========

Når globals er off, er $test ukendt. Hvis den er on, hentes
værdien fra select'en (mere generelt: fra et form-element) med
samme navn.

Sådan løses problemet:

<?
$test = $_POST['test'];
if ($test=='Fortsæt') gørnogetsmart();
?>

(resten uændret)

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Jakob Munck (07-07-2006)
Kommentar
Fra : Jakob Munck


Dato : 07-07-06 19:22


"Bertel Lund Hansen" <nospamfilius@lundhansen.dk> skrev i en meddelelse
news:44ae988a$0$1970$ba624c82@nntp02.dk.telia.net...
> Jakob Munck skrev:
>
>> php_flag register_globals 1
>
>> Bemærk, værdien er sat til 1 i stedet for 0, som anvendes i rod-htaccess.
>> Så
>> er der skriveadgang til mappen. Men om problemet kunne være løst på en
>> bedre
>> måde, ved jeg ikke.
>
> Det er en sikkerhedsfordel at register_globals er 0.
>


Ja, det forstår jeg. Men det er så også kun for én mappe, at
regoster_globals er sat til 1. For resten af websiten er den stadig 0. Og
det vigtige er, at jeg ikke kan finde nogen anden måde at gøre upload mulig
i dette (i øvrigt) rigtig gode galleri.

Har du en anden og bedre løsning, hører jeg den meget gerne.

v.h.
Jakob



Jesper H (07-07-2006)
Kommentar
Fra : Jesper H


Dato : 07-07-06 22:15

Hmm, selv et lille hul i dæmningen er ofte nok til at få hele lortet
til at bryde sammen, uanset hvor hullet er. Så jeg vil give de andre
ret i, at register_globals bør være nul.

Noget helt andet er, at register_globals 1 IKKE på nogen måde giver
skrive-rettigheder til en mappe. Det har intet med sagen at gøre.
Derimod har det måske kunnet få dit script til at virke, men det er
en helt anden sag, og et spørgsmål om hvorvidt man ønsker at være
skydeskive eller bag et skjold

Lad os se på nogle af linierne i dit kode, og finde ud af hvor
problemet opstår:

[snip noget kode]
> $add="img_store/$userfile_name"; // the path with the file name where the
> file will be stored, upload is the directory name.
> if(move_uploaded_file ($userfile, $add)){
[snip]
Læg mærke til at her mangler variablerne $userfile_name og $userfile
at blive defineret. Jeg gætter på, at du har dem til at stå i
adresselinien, noget i retning af:
dit_script.php?userfile_name=et-eller-andet&userfile=et-eller-andet-2
I så fald er det GET-variable. Muligvis kan de også komme som
POST-variable, f.eks. hvis du på en tidligere side har en form hvor
method er POST. Uanset hvilken metode der bruges, vil userfile_name og
userfile komme ind direkte som variable, uden at du verificerer at de
ikke er blevet fusket med. Dér er et sikkerheds-hul, som man bør
være opmærksom på, hvis ikke man vil lave sin hjemmeside om HELT
forfra, og måske stå skoleret for sin webhost...

[snip]
> if (!($userfile_type =="image/pjpeg" OR $userfile_type=="image/gif")){echo
> "Filen skal være i .jpg eller .gif format!<BR>";
> exit;}
[snip]
Her er det igen. $userfile_type er ikke defineret (i alt fald ikke i
det, du har sendt).

Jeg vil foreslå at du gennemgår dit script linie for linie og kigger
på, hvorfor det ikke virker med register_globals 0. Der er meget
nyttigt at lære, og samtidig øger du sikkerheden markant, efter min
mening. Jeg ved det er et møjsommeligt arbejde, og at det er trælst
man ikke altid bare kan få svaret serveret. Men til en anden gang
ville det måske være udbytterigt og, om ikke andet, høfligt at læse
eller i alt fald skimme den litteratur, man bliver henvist til, i
stedet for at forvente et færdigt facit uden at skulle tænke sig om.

Håber du får løst problemet med scriptet.

--
Mvh Jesper, http://fdf.dk/landsdel1/



Jakob Munck skrev:

> "Bertel Lund Hansen" <nospamfilius@lundhansen.dk> skrev i en meddelelse
> news:44ae988a$0$1970$ba624c82@nntp02.dk.telia.net...
> > Jakob Munck skrev:
> >
> >> php_flag register_globals 1
> >
> >> Bemærk, værdien er sat til 1 i stedet for 0, som anvendes i rod-htaccess.
> >> Så
> >> er der skriveadgang til mappen. Men om problemet kunne være løst på en
> >> bedre
> >> måde, ved jeg ikke.
> >
> > Det er en sikkerhedsfordel at register_globals er 0.
> >
>
>
> Ja, det forstår jeg. Men det er så også kun for én mappe, at
> regoster_globals er sat til 1. For resten af websiten er den stadig 0. Og
> det vigtige er, at jeg ikke kan finde nogen anden måde at gøre upload mulig
> i dette (i øvrigt) rigtig gode galleri.
>
> Har du en anden og bedre løsning, hører jeg den meget gerne.
>
> v.h.
> Jakob


Jakob Munck (07-07-2006)
Kommentar
Fra : Jakob Munck


Dato : 07-07-06 23:40


>Noget helt andet er, at register_globals 1 IKKE på nogen måde giver
>skrive-rettigheder til en mappe. Det har intet med sagen at gøre.
>Derimod har det måske kunnet få dit script til at virke, men det er
>en helt anden sag, og et spørgsmål om hvorvidt man ønsker at være
>skydeskive eller bag et skjold


Sandt nok, skriverettighed reguleres med chmos, og det er naturligvis bragt
i orden.


>Lad os se på nogle af linierne i dit kode, og finde ud af hvor
>problemet opstår:

[snip noget kode]
> $add="img_store/$userfile_name"; // the path with the file name where the
> file will be stored, upload is the directory name.
> if(move_uploaded_file ($userfile, $add)){
[snip]
>Læg mærke til at her mangler variablerne $userfile_name og $userfile
>at blive defineret. Jeg gætter på, at du har dem til at stå i
>adresselinien, noget i retning af:
>dit_script.php?userfile_name=et-eller-andet&userfile=et-eller-andet-2
>I så fald er det GET-variable. Muligvis kan de også komme som
>POST-variable, f.eks. hvis du på en tidligere side har en form hvor
>method er POST. Uanset hvilken metode der bruges, vil userfile_name og
>userfile komme ind direkte som variable, uden at du verificerer at de
>ikke er blevet fusket med.


Ja, de kommer fra en upload-form. Hvordan mener du at der skulle blive
"fusket" med dem? Af hvem? Og hvordan mener du at jeg skulle "verificere" at
de ikke er blevet fusket med?


[snip]
> if (!($userfile_type =="image/pjpeg" OR $userfile_type=="image/gif")){echo
> "Filen skal være i .jpg eller .gif format!<BR>";
> exit;}
[snip]
>Her er det igen. $userfile_type er ikke defineret (i alt fald ikke i
>det, du har sendt).

>Jeg vil foreslå at du gennemgår dit script linie for linie og kigger
>på, hvorfor det ikke virker med register_globals 0. Der er meget
>nyttigt at lære, og samtidig øger du sikkerheden markant, efter min


Det har jeg gjort adskillige gange allerede, men jeg finder ikke - med min
begrænsede viden - nogle fejl.


>man ikke altid bare kan få svaret serveret. Men til en anden gang
>ville det måske være udbytterigt og, om ikke andet, høfligt at læse
>eller i alt fald skimme den litteratur, man bliver henvist til, i


Er også sket, men jeg blev ikke meget klogere, ud over at jeg - som vist -
fandt en (uperfekt) løsning. Desværre giver læsning ikke altid det ønskede
resultat, især hvis læserens forudsætningerne er for svage. I princippet kan
ethvert spørgsmål her i NG jo besvares med en henvisning til de uendelige
masser af information, som er tilgængelige på nettet. Men problemer er ikke
mange på information, men derimode mangel på KORT, PRÆCIS OG FORSTÅELIG
information. Og det er noget helt andet.


>stedet for at forvente et færdigt facit uden at skulle tænke sig om.

Ja, du har ret i at man skal tænke sig om..


Jeg siger tak for kommentaren.

v.h.
Jakob







Håber du får løst problemet med scriptet.

--
Mvh Jesper, http://fdf.dk/landsdel1/



Jakob Munck skrev:

> "Bertel Lund Hansen" <nospamfilius@lundhansen.dk> skrev i en meddelelse
> news:44ae988a$0$1970$ba624c82@nntp02.dk.telia.net...
> > Jakob Munck skrev:
> >
> >> php_flag register_globals 1
> >
> >> Bemærk, værdien er sat til 1 i stedet for 0, som anvendes i
> >> rod-htaccess.
> >> Så
> >> er der skriveadgang til mappen. Men om problemet kunne være løst på en
> >> bedre
> >> måde, ved jeg ikke.
> >
> > Det er en sikkerhedsfordel at register_globals er 0.
> >
>
>
> Ja, det forstår jeg. Men det er så også kun for én mappe, at
> regoster_globals er sat til 1. For resten af websiten er den stadig 0. Og
> det vigtige er, at jeg ikke kan finde nogen anden måde at gøre upload
> mulig
> i dette (i øvrigt) rigtig gode galleri.
>
> Har du en anden og bedre løsning, hører jeg den meget gerne.
>
> v.h.
> Jakob



Jesper H (08-07-2006)
Kommentar
Fra : Jesper H


Dato : 08-07-06 09:26

Hej Jakob


Jakob Munck skrev:

> >Lad os se på nogle af linierne i dit kode, og finde ud af hvor
> >problemet opstår:
>
> [snip noget kode]
> > $add="img_store/$userfile_name"; // the path with the file name where the
> > file will be stored, upload is the directory name.
> > if(move_uploaded_file ($userfile, $add)){
> [snip]
> >Læg mærke til at her mangler variablerne $userfile_name og $userfile
> >at blive defineret. Jeg gætter på, at du har dem til at stå i
> >adresselinien, noget i retning af:
> >dit_script.php?userfile_name=et-eller-andet&userfile=et-eller-andet-2
> >I så fald er det GET-variable. Muligvis kan de også komme som
> >POST-variable, f.eks. hvis du på en tidligere side har en form hvor
> >method er POST. Uanset hvilken metode der bruges, vil userfile_name og
> >userfile komme ind direkte som variable, uden at du verificerer at de
> >ikke er blevet fusket med.
>
>
> Ja, de kommer fra en upload-form. Hvordan mener du at der skulle blive
> "fusket" med dem?
Det du mangler er givetvis noget i retning af
$userfile_name = $_FILES['userfile']['name'];
Se eventuelt:
http://dk.php.net/manual/en/features.file-upload.php#features.file-upload.post-method

En uploadform, og såmænd alle andre forme, virker på den måde, at
de kalder et script på serveren og i selve kaldet inkluderer selve de
variable, der er blevet fyldt ind i formen. Eksempel:

<form method="get" action="et-andet-script.php">
<input name="alder" type=text maxlength=3>
<input type=submit value="Send min alder">
</form>

Når brugeren her trykker submit, vil følgende adresse blive kaldt:
et-andet-script.php?alder=37 (fiktiv værdi)
og når du har register_globals 1, vil der i et-andet-script.php så
helt automatisk opstå variablen $alder=37
Og det er her, problemet opstår. For hvad skulle forhindre en
ondsindet bruger eller script i at kalde et-andet-script.php med en
anden værdi? Hvis $alder f.eks. straks bliver brugt i et sql-query, er
der stor risiko for SQL-injection, selvom $alder kun er tiltænkt en
uskyldig heltalsværdi.

Som det siges så smukt på
http://en.wikibooks.org/wiki/Programming:PHP:SQL_Injection
"Never trust user provided data, process this data only after
validation." Jeg ved du allerede har været lidt inde at kigge på
SQL-injection, prøv eventuelt at kigge på dette link. Der er et par
eksempler på, hvad man kunne finde på at putte ind i
et-andet-script.php?alder=***HER***

> Af hvem?
Folk og scripts med skumle intentioner har der aldrig været mangel
på.

> Og hvordan mener du at jeg skulle "verificere" at
> de ikke er blevet fusket med?
Der er mange måder at gøre det på, det kommer helt an på hvilke
typer data, man har med at gøre. Typisk kigger man på det, man ved om
de data, man ønsker brugeren skal skrive. F.eks. ved alder-eksemplet:
En alder består typisk af 1, 2, eller måske endda 3 tal, og intet
mere. Man kunne så teste hvorvidt den returnerede værdi opfylder
dette kriterium:
<?PHP
if (preg_match('/^[0-9]{1,3}$/',$_GET['alder']))
{
// Hvis betingelsen ovenfor er opfyldt, består alder kun af et til
tre tal mellem 0 og 9.
$alder = intval($_GET['alder']);
// Er man stadig en smule paranoid, kan man gøre som ovenfor, hvor
man sætter $alder til at være en heltalsværdi af $_GET['alder'].
Dette skal man naturligvis ikke gøre ved tekst-felter.
}
else
{
die('Hacker attempt.');
}
Man kunne måske ydermere kigge på, om hvorvidt $alder er indenfor
nogle realistiske grænser, f.eks. 0-150 år.
Ved f.eks. navne kan man måske også gætte på, at alle navne burde
kunne skrives vha. a-z, A-Z, æøå, ÆØÅ, eventuelt et par kommaer
og punktummer og bindestreger. Men intet mere. På samme måde kan man
bygge en regular expression op, som kan bruges i preg_match som vist
før.

Mht. f.eks. file-type (som du bruger) kan du verificere at den kun
indeholder bogstaver fra a-z, evt. tal (ærligt, kender ikke filetype
så godt), bindestreger og skråstreger. Men ikke mere, ikke noget med
linieskift, og andet skidt


> [snip]
> > if (!($userfile_type =="image/pjpeg" OR $userfile_type=="image/gif")){echo
> > "Filen skal være i .jpg eller .gif format!<BR>";
> > exit;}
> [snip]
> >Her er det igen. $userfile_type er ikke defineret (i alt fald ikke i
> >det, du har sendt).
>
> >Jeg vil foreslå at du gennemgår dit script linie for linie og kigger
> >på, hvorfor det ikke virker med register_globals 0. Der er meget
> >nyttigt at lære, og samtidig øger du sikkerheden markant, efter min
>
>
> Det har jeg gjort adskillige gange allerede, men jeg finder ikke - med min
> begrænsede viden - nogle fejl.

Sandt nok, man kan bruge lang tid på at finde ud af, hvor fejlen
ligger. Men øvelse gør mester

> >man ikke altid bare kan få svaret serveret. Men til en anden gang
> >ville det måske være udbytterigt og, om ikke andet, høfligt at læse
> >eller i alt fald skimme den litteratur, man bliver henvist til, i
>
>
> Er også sket, men jeg blev ikke meget klogere, ud over at jeg - som vist -
> fandt en (uperfekt) løsning. Desværre giver læsning ikke altid det ønskede
> resultat, især hvis læserens forudsætningerne er for svage. I princippet kan
> ethvert spørgsmål her i NG jo besvares med en henvisning til de uendelige
> masser af information, som er tilgængelige på nettet. Men problemer er ikke
> mange på information, men derimode mangel på KORT, PRÆCIS OG FORSTÅELIG
> information. Og det er noget helt andet.

Det er rigtigt.

> >stedet for at forvente et færdigt facit uden at skulle tænke sig om.
>
> Ja, du har ret i at man skal tænke sig om..
>
>
> Jeg siger tak for kommentaren.
>
> v.h.
> Jakob

Jeg håber du kigger lidt mere på verifikation af brugerinput, tro
mig, det er MEGET brugbart.

--
Mvh Jesper, http://fdf.dk/landsdel1/


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste