Dateisystem - Sicherheit
PHP
ist
von
den
in
den
meisten
Serversystemen
implementierten
Sicherheitseinstellungen
hinsichtlich
der
Berechtigungen
auf
Datei
-
und
Verzeichnisebene
abhängig
.
Dies
verleiht
Ihnen
Kontrolle
darüber
,
welche
Dateien
in
dem
Dateisystem
gelesen
werden
dürfen
.
Vorsicht
ist
bei
weltweit
lesbaren
Dateien
geboten
um
sicherzustellen
,
dass
diese
sicher
von
allen
Usern
mit
Zugriff
auf
dieses
Dateisystem
(
nur
)
gelesen
werden
können
.
Da
PHP
entwickelt
wurde
um
Zugriffe
auf
das
Dateisystem
auf
Benutzebene
zu
erlauben
,
ist
es
natürlich
auch
möglich
ein
PHP
Skript
zu
schreiben
das
Ihnen
erlaubt
Systemdateien
wie
/
etc
/
passwd
zu
lesen
,
Ethernetverbindungen
zu
modifizieren
,
enorme
Druckaufträge
zu
senden
,
etc
.
Dies
hat
offensichtliche
Implikationen
,
indem
Sie
sicherstellen
müssen
,
dass
alle
von
Ihnen
zu
lesenden
bzw
.
zu
schreibenden
Dateien
auch
die
richtigen
sind
.
Stellen
Sie
sich
folgendes
Skript
vor
,
in
dem
ein
User
zum
Ausdruck
bringt
,
dass
gerne
eine
Datei
in
seinem
Heimatverzeichnis
löschen
möchte
.
Dies
geht
von
einer
Situation
aus
,
in
der
ein
PHP
Web-Interface
regelmäßig
zum
Dateimanagement
verwendet
wird
,
und
der
Apache
User
ist
auch
berechtigt
,
in
seinem
Heimatverzeichnis
Dateien
zu
löschen
.
Beispiel
5-1
.
Schlechte
Variablenprüfung
führt
zu...
.
?php
/
/
Löschen
einer
Datei
aus
dem
Heimatverzeichnis
des
Users
$username
=
$_POST[
'user_submitted_name']
;
$homedir
=
"
/
home
/
$username"
;
$file_to_delete
=
"$userfile"
;
unlink
("$homedir
/
$userfile")
;
echo
"$file_to_delete
wurde
gelöscht
!"
;
?
|
|
Da der Benutzername über ein User-Formular zu posten ist, kann
jeder einen Benutzer- und Dateinamen von jemand anderen
übertragen, und Dateien löschen. In diesem Fall empfiehlt es
sich, eine andere Form der Authentifizierung zu verwenden.
Stellen Sie sich vor was passieren würde, wenn die übertragenen
Variablen "../etc/" und "passwd" beinhalten würden. Der Code
würde dann effektiv lesen:
Beispiel
5-2
.
..
.
Ein
Angriff
auf
das
Dateisystem
?php
/
/
löscht
eine
Datei
irgendwo
auf
der
Festplatte
,
wo
der
/
/
Benutzer
die
nötigen
Rechte
besitzt
.
Wenn
PHP
root
hat
:
$username
=
"
.
.
/
etc
/
"
;
$homedir
=
"
/
home
/
.
.
/
etc
/
"
;
$file_to_delete
=
"passwd"
;
unlink
("
/
home
/
.
.
/
etc
/
passwd")
;
echo
"
/
home
/
.
.
/
etc
/
passwd
wurde
gelöscht
!"
;
?
|
|
Es gibt zwei wichtige Kriterien die Sie beachten sollten, um
diese Dinge zu vermeiden:
Hier ist ein verbessertes Skript:
Beispiel
5-3
.
Etwas
sicherere
Prüfung
des
Dateinamens
?php
/
/
löscht
eine
Datei
von
der
Festplatte
,
auf
die
/
/
der
PHP
user
Zugriff
hat
.
$username
=
$_SERVER[
'REMOTE_USER']
;
/
/
verwendet
eine
/
/
Authentifizierungsmethode
$homedir
=
"
/
home
/
$username"
;
$file_to_delete
=
basename("$userfile")
;
/
/
den
Pfad
entfernen
unlink
($homedir
/
$file_to_delete)
;
$fp
=
fopen("
/
home
/
logging
/
filedelete.log"
,"+a")
;
/
/logge
die
Löschung
$logstring
=
"$username
$homedir
$file_to_delete"
;
fputs
($fp
,
$logstring)
;
fclose($fp)
;
echo
"$file_to_delete
wurde
gelöscht
!"
;
?
|
|
Auch dies nicht völlig makellos. Wenn Ihr
Authentifizierungssystem Benutzern erlauben sollte, deren eigene
Logins zu kreieren, und ein Benutzer wählt den Login "../etc",
ist das System wieder aufgedeckt. Aus diesem Grund ziehen Sie es
vielleicht vor, einen besseren Check zu schreiben:
Beispiel
5-4
.
Sicherere
Dateinamensprüfung
?php
$username
=
$HTTP_SERVER_VARS[
'REMOTE_USER']
;
/
/
verwendet
eine
/
/
Authentifizierungsmethode
$homedir
=
"
/
home
/
$username"
;
if
(!ereg('^[^
.
/
][^
/
]*$'
,
$userfile)
)
die('bad
filename')
;
/
/
"DIE"
,
gehen
Sie
nicht
weiter
if
(!ereg('^[^
.
/
][^
/
]*$'
,
$username)
)
die('bad
username')
;
/
/
"DIE
"
,
gehen
Sie
nicht
weiter
/
/etc..
.
?
|
|
Abhängig
vom
Betriebssystem
gibt
es
eine
große
Anzahl
Dateien
mit
der
Sie
sich
befassen
sollten
,
inklusive
Einträge
für
Geräte
(
/
dev
/
oder
com1)
,
Konfigurationsdateien
(
/
etc
/
Dateien
und
die
.ini
Dateien)
,
gut
bekannte
Verzeichnisse
(
/
home
/
,
My
Documents
)
,
etc
.
Aus
diesem
Grund
ist
es
gewöhnlich
einfacher
eine
Vorgangsweise
einzuführen
,
bei
der
außer
den
von
Ihnen
explizit
erlaubten
Dingen
alles
verboten
ist
.