23. 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 befojásoló beállítások:

safe_mode = Off 
open_basedir = 
safe_mode_exec_dir = 
safe_mode_allowed_env_vars = PHP_ 
safe_mode_protected_env_vars = LD_LIBRARY_PATH 
disable_functions = 
   

Ha a Safe Mode 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. 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 23-1. Safe Mode-ban korlátozott függvények

FüggvényKorlátozás
dbmopen()Ellenőrzi, hogy a fileok/könyvtárak, amikkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
dbase_open()Ellenőrzi, hogy a fileok/könyvtárak, amikkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
filepro()Ellenőrzi, hogy a fileok/könyvtárak, amikkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
filepro_rowcount()Ellenőrzi, hogy a fileok/könyvtárak, amikkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
filepro_retrieve()Ellenőrzi, hogy a fileok/könyvtárak, amikkel 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 a fileok/könyvtárak, amikkel 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, amiben 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 a fileok/könyvtárak, amikkel 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, amiben 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, amiben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
rmdir()Ellenőrzi, hogy a fileok/könyvtárak, amikkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
rename()Ellenőrzi, hogy a fileok/könyvtárak, amikkel 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, amiben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
unlink()Ellenőrzi, hogy a fileok/könyvtárak, amikkel 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, amiben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
copy()Ellenőrzi, hogy a fileok/könyvtárak, amikkel 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, amiben 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 a fileok/könyvtárak, amikkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
chown()Ellenőrzi, hogy a fileok/könyvtárak, amikkel dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkeznek-e, mint az éppen futó program.
chmod()Ellenőrzi, hogy a fileok/könyvtárak, amikkel 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 a fileok/könyvtárak, amikkel 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, amiben dolgozni szeretnél, ugyanazzal a felhasználói azonosítóval (UID) rendelkezik-e, mint az éppen futó program.
symlink()Ellenőrzi, hogy a fileok/könyvtárak, amikkel 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, amiben 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 a fileok/könyvtárak, amikkel 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, amiben 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 a fileok/könyvtárak, amikkel 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. ??