Beveiliging van het bestandssysteem

PHP houdt vast aan de meeste rechten die het server systeem gebruikt voor permissies op bestanden en directories . Dit maakt het mogelijk dat je kunt controleren welke bestanden op het systeem mogen worden gelezen . Voorzichtigheid moet genomen worden met elke bestand dat world readable is om ervoor te zorgen dat deze geen informatie bevat die niet bedoeld zijn voor eventuele andere gebruikers die toegang hebben tot dit bestand .

Omdat PHP is ontworpen met gebruikers level toegang tot het bestandssysteem , is het helemaal mogelijk om een PHP script te schrijven dat systeembestanden zoals / etc / password bewerkt , ethernet connecties door de war gooit of heel veel uitprint op een printer . Dit geeft een aantal implicaties ; je moet namelijk goed controleren dat de bestanden die je leest en schrijft ook diegene zijn die je denkt dat je leest en schrijft .

Neem het volgende in gedachten : als een gebruikt te kennen geeft een bestand in hun homedirectory te verwijderen . Neem aan dat dit een situatie betreft waar een PHP web interface wordt gebruikt voor bestands beheer . Hierom heeft de Apache gebruiker rechten om bestanden in de home directory van de gebruiker aan te passen en te verwijderen .

Voorbeeld 5-1 . Slechte variabele controle leidt tot.. .

 
?php

 
/

 
/

 
Verwijder

 
een

 
bestand

 
uit

 
de

 
gebruikers

 
home

 
directory

 
$gebruiker

 
=

 
$aangegeven_naam

 
;

 
$homedir

 
=

 
"

 
/

 
home

 
/

 
$gebruiker"

 
;

 
$te_verwijderen_bestand

 
=

 
"$bestandje"

 
;

 
unlink

 
($homedir

 
/

 
$bestandje)

 
;

 
echo

 
"$te_verwijderen_bestand

 
is

 
verwijderd

 
!"

 
;

 
?



Omdat de gebruikersnaam is te posten vanuit een form, kunnen gebruikers bestanden benaderen van iemand anders, en deze verwijderen. In dit voorbeeld heb je enige vorm van authenticatie nodig. Neem in gedachten wat er kan gebeuren als de geposte variabelen waren "../etc/" en "passwd". De code zou dan effectief zijn:

Voorbeeld 5-2 . .. . Een aanval op het bestandssysteem

 
?php

 
/

 
/

 
verwijderen

 
een

 
bestanden

 
ergens

 
op

 
de

 
harde

 
schijf

 
waar

 
/

 
/

 
de

 
PHP

 
gebruiker

 
toegang

 
tot

 
heeft

 
.




 
Als

 
PHP

 
root

 
rechten

 
heeft

 
:

 
$gebruiker

 
=

 
"

 
.

 
.

 
/

 
etc

 
/

 
"

 
;

 
$homedir

 
=

 
"

 
/

 
home

 
/

 
.

 
.

 
/

 
etc

 
/

 
"

 
;

 
$te_verwijderen_bestand

 
=

 
"passwd"

 
;

 
unlink

 
("

 
/

 
home

 
/

 
.

 
.

 
/

 
etc

 
/

 
passwd")

 
;

 
echo

 
"

 
/

 
home

 
/

 
.

 
.

 
/

 
etc

 
/

 
passwd

 
"

 
is

 
verwijderd

 
!"

 
;

 
?



Er zijn twee belangrijke manieren om dit soort dingen tegen te gaan: Hier is een verbeterd script:

Voorbeeld 5-3 . Veiliger bestandsnaam controle

 
?php

 
/

 
/

 
verwijderd

 
een

 
bestand

 
van

 
de

 
schijf

 
waartoe

 
de

 
PHP

 
gebruiker

 
/

 
/

 
toegang

 
heeft

 
.

 
$gebruiker

 
=

 
$HTTP_REMOTE_USER

 
;

 
/

 
/

 
use

 
an

 
authentication

 
mechanisim

 
$homedir

 
=

 
"

 
/

 
home

 
/

 
$gebruiker"

 
;

 
$te_verwijderen_bestand

 
=

 
basename("$bestand")

 
;

 
/

 
/

 
stript

 
directories

 
unlink

 
($homedir

 
/

 
$te_verwijderen_bestand)

 
;

 
$fp

 
=

 
fopen("

 
/

 
home

 
/

 
logging

 
/

 
filedelete.log"

 
,"+a")

 
;

 
/

 
/log

 
de

 
verwijdering

 
$logstring

 
=

 
"$HTTP_REMOTE_USER

 
$homedir

 
$te_verwijderen_bestand"

 
;

 
fputs

 
($fp

 
,

 
$logstring)

 
;

 
fclose($fp)

 
;

 
echo

 
"$te_verwijderen_bestand

 
is

 
verwijderd

 
!"

 
;

 
?



Een alternatief is om een eigen controle uit te voeren:

Voorbeeld 5-4 . Veiliger bestandsnaam controle

 
?php

 
$username

 
=

 
$HTTP_REMOTE_USER

 
;

 
$homedir

 
=

 
"

 
/

 
home

 
/

 
$username"

 
;

 
if

 
(!ereg('^[^

 
.

 
/

 
][^

 
/

 
]*$'

 
,

 
$userfile)

 
)

 
die('niet

 
geldige

 
bestansnaam')

 
;

 
/

 
/die

 
,

 
ga

 
niet

 
verder

 
/

 
/etc..

 
.

 
?



Afhankelijke van je operating system zijn er een groot aantal files die extra andacht vereisen, inbegrepen zijn device entries (/dev/ or COM1), configuratie files (/etc/ bestanden en de .ini files), bekende bestandslocaties (/home/, Mijn Documenten), etc. Om deze reden is het vaak makkelijker om een policy aan te houden die alles verbied, behalve de dingen die je expliciet toelaat.