24. Fejezet. Safe Mode

Tartalom
A safe mode használatakor tiltott/korlátozott függvények

A safe mode egy próbálkozás a megosztott szerverek biztonsági problémáinak megoldására. Architektúrálisan nem korrekt, hogy ezt a problémát a PHP szintjén próbáljuk megoldani, de mivel a többi alternatíva a webszerver és operációs rendszer szinteken nem igazán használható, sokan - különösen az internetszolgáltatók - a safe mode-ot használják egyelőre.

A safe mode működését befolyásoló beállítások:
safe_mode = Off
safe_mode_gid = 0
safe_mode_include_dir = 
safe_mode_exec_dir =
open_basedir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_fnctions =

Ha a safe_mode beállítás be van kapcsolva, a PHP ellenőrzi, hogy az aktuálisan futó szkript tulajdonosa megegyezik-e a kezelésre megnyitandó file tulajdonosával. Például:
-rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 script.php 
-rw-r--r--    1 root     root       1116 May 26 18:01 /etc/passwd
Futtatva ezt a script.php programot:
<?php
 readfile('/etc/passwd'); 
?>
a következő hibát kapod, ha a safe mode be van kapcsolva:
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not 
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2

Ha a safe_mode helyett egy open_basedir könyvtárat állítasz be, akkor minden engedélyezett file művelet erre a könyvtárra korlátozódik. Például (Apache httpd.conf példa):
<Directory /docroot>
php_admin_value open_basedir /docroot 
</Directory>
Ha a fenti script.php programot futtatod, ezzel az open_basedir beállítással, akkor a következő eredményt kapod:
Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2

Le tudsz tiltani különböző függvényeket akár egyenként is. Meg kell azonban jegyezni, hogy a disable_functions beállítás csak a php.ini-ben használható. Ez azt jelenti, hogy nem tudsz virtuális hosztonként, vagy könyvtáranként függvényeket letiltani a httpd.conf vagy .htaccess állományokban. Ha hozzáadod ezt a php.ini állományodhoz:
disable_functions readfile,system
A következő hibát kapod:
Warning: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2

A safe mode használatakor tiltott/korlátozott függvények

Ez még valószínűleg nem teljes, és nem korrekt listája a függvényeknek, amiket a safe mode korlátoz.

Táblázat 24-1. Safe modeban korlátozott függvények

FüggvényKorlátozás
dbmopen()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
dbase_open()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
filepro()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
filepro_rowcount()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
filepro_retrieve()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
ifx_*()sql_safe_mode megkötések, (!= safe mode)
ingres_*()sql_safe_mode megkötések, (!= safe mode)
mysql_*()sql_safe_mode megkötések, (!= safe mode)
pg_loimport()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
posix_mkfifo()Ellenőrzi, hogy a könyvtár, amelyben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
putenv()Alkalmazkodik a safe_mode_protected_env_vars és safe_mode_allowed_env_vars ini beállításokhoz. Lásd még a putenv() leírását
move_uploaded_file()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
chdir()Ellenőrzi, hogy a könyvtár, amelyben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
dl()Ez a függvény nem használható, ha a safe mode be van kapcsolva.
végrehajtó operátorEz a függvény nem használható, ha a safe mode be van kapcsolva.
shell_exec() (a végrehajtó operátor függvény megfelelője)Ez a függvény nem használható, ha a safe mode be van kapcsolva.
exec()Futtatható állományok végrehajtására csak a safe_mode_exec_dir könyvtáron belül van lehetőség. Praktikus okok miatt nem lehetséges .. komponenst elhelyeni a futtatandó program elérési útjában.
system()Futtatható állományok végrehajtására csak a safe_mode_exec_dir könyvtáron belül van lehetőség. Praktikus okok miatt nem lehetséges .. komponenst elhelyeni a futtatandó program elérési útjában.
passthru()Futtatható állományok végrehajtására csak a safe_mode_exec_dir könyvtáron belül van lehetőség. Praktikus okok miatt nem lehetséges .. komponenst elhelyeni a futtatandó program elérési útjában.
popen()Futtatható állományok végrehajtására csak a safe_mode_exec_dir könyvtáron belül van lehetőség. Praktikus okok miatt nem lehetséges .. komponenst elhelyeni a futtatandó program elérési útjában.
mkdir()Ellenőrzi, hogy a könyvtár, amelyben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
rmdir()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
rename()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program. Ellenőrzi, hogy a könyvtár, amelyben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
unlink()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program. Ellenőrzi, hogy a könyvtár, amelyben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
copy()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program. Ellenőrzi, hogy a könyvtár, amelyben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program. (a source és target paraméterekre)
chgrp()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
chown()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
chmod()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program. Ráadásul nem állíthatod át a SUID, SGID és sticky biteket
touch()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program. Ellenőrzi, hogy a könyvtár, amelyben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
symlink()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program. Ellenőrzi, hogy a könyvtár, amelyben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program. (csak a cél ellenőrzött)
link()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program. Ellenőrzi, hogy a könyvtár, amelyben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program. (csak a cél ellenőrzött)
ob_gzhandler()Ellenőrzi, hogy az állományok/könyvtárak, amelyekkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
getallheaders()Safe modeban, semmilyen 'authorization' (nem kisbetű/nagybetű érzékeny) kezdetű fejléc sem kerül visszaadásra. Figyelem: ez nem működik megfelelően a getallheaders() AOL szerveres megvalósításában.
Minden függvény, ami a php4/main/fopen_wrappers.c funkciókat használja. ??