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 .