Fájlrendszer biztonság
A PHP tiszteli a rendszerbe épÃtett biztonsági megoldásokat, különös tekintettel a fájlok és könyvtárak hozzáférési jogosultságaira. Ez lehetÅ‘séget ad arra, hogy megszabd, mely fájlok olvashatóak a rendszerben. A mindenki számára olvasható fájloknál ügyelni kell arra, hogy ne tartalmazzanak olyan fontos adatot, amit nem szabad elolvasnia akármelyik felhasználónak a rendszeren.
Mivel a PHP úgy készült, hogy felhasználói szintű fájlrendszer hozzáférést ad, lehetséges olyan program készÃtése, amely a rendszerfájlokat olvassa, mint pl. az /etc/passwd fájl, ethernet kapcsolatokat módosÃt, nagyméretű nyomtatási feladatokat küld, stb. Ez maga után von egy nyilvánvaló következtetést, neveztesen minden esetben meg kell gyÅ‘zÅ‘dni a programokban arról, hogy a helyes fájlokat olvassa illetve Ãrja a program.
Nézzük a következő szkriptet, ahol a felhasználó megadja, hogy le szeretne törölni egy fájlt a könyvtárában. Ez többnyire egy webes felületet jelent, ahol egy PHP program használatos fájlkezelésre, ezért az Apache-t futtató felhasználónak engedélyezni kell a fájlok törlését a felhasználó könyvtárában.
Example#1 A helytelen változó használat ...
<?php
// egy fájl törlése a user könyvtárából
$usernev = $_POST["user_altal_beadott_nev"];
$konyvtar = "/home/$usernev";
$torlendo_file = "$userfile";
unlink ($konyvtar/$torlendo_file);
echo "$torlendo_file törölve!";
?>
Example#2 ... fájlrendszer támadáshoz vezethet
<?php
// egy fájl törlése akárhonnan, ahol a PHP usernek
// joga van erre. Ha a PHP root userként fut:
$usernev = "../etc/"
$konyvtar = "/home/../etc/";
$torlendo_file = "passwd";
unlink ("/home/../etc/passwd");
echo "/home/../etc/passwd törölve!";
?>
- Csak korlátozott jogok beállÃtása a PHP-t futtató felhasználónak.
- Minden felhasználótól bejövő adat ellenőrzése.
Example#3 Biztonságosabb fájl ellenőrzés
<?php
// egy fájl törlése akárhonnan, ahol a PHP usernek
// joga van erre.
$usernev = $_SERVER['REMOTE_USER']; // ez a user azonosÃtott neve
// (ha volt elÅ‘tte azonosÃtás)
$konyvtar = "/home/$usernev";
$torlendo_file = basename("$userfile"); // elérési trükközés eldobása
unlink ($konyvtar/$torlendo_file);
$fp = fopen("/home/logging/filedelete.log","+a"); // törlés naplózása
$logstring = "$usernev $konyvtar $torlendo_file";
fputs ($fp, $logstring);
fclose($fp);
echo "$torlendo_file törölve!";
?>
Example#4 Biztonságosabb fájlnév-ellenőrzés
<?php
$usernev = $_SERVER['REMOTE_USER']; // hitelesites
$homedir = "/home/$usernev"; $homedir = "/home/$usernev";
if (!ereg('^[^./][^/]*$', $userfile))
die('rossz fájlnév'); // vége, nincs feldolgozás
if (!ereg('^[^./][^/]*$', $usernev))
die('rossz usernev'); // vége, nincs feldolgozás
//stb...
?>
A használt operációs rendszertÅ‘l függÅ‘en széles a védeni kÃvánt fájlok skálája, beleértve az eszköz hivatkozásokat (/dev/ vagy COM1), konfigurációs fájlokat (/etc/ és az .ini fájlok), jól ismert tárolóhelyek (/home/, My Documents), stb. E sokaság miatt könnyebb egy olyan rendszert készÃteni, ahol mindent tiltunk azon kÃvül, amelyet kifejezetten megengedünk.