Kapitola 23. BezpeΦn² re╛im

BezpeΦn² re╛im PHP je pokus o °e╣enφ bezpeΦnosti sdφlen²ch server∙. Je architekturßln∞ nekorektnφ pokou╣et se °e╣it tento problΘm na ·rovni PHP, ale proto╛e °e╣enφ na ·rovni webovskΘho serveru a operaΦnφho systΘmu nejsou p°φli╣ realistickß, mnoho lidφ, zvla╣t∞ ISP, pou╛φvß nynφ bezpeΦn² re╛im.

KonfiguraΦnφ direktivy, kterΘ ovlßdajφ bezpeΦn² re╛im:
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 =

Pokud je safe_mode zapnut², PHP kontroluje, je-li vlastnφk b∞╛φcφho skriptu vlastnφkem souboru, s nφm╛ se mß manipulovat. Nap°φklad:
-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
Spu╣t∞nφ skriptu script.php
<?php
 readfile('/etc/passwd'); 
?>
bude mφt v bezpeΦnΘm re╛imu za v²sledek tuto chybu:
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

Pokud namφsto safe_mode nastavφte adresß° open_basedir, potom v╣echny operace se soubory budou omezeny pod specifikovan² adresß°. Nap°φklad (p°φklad Apache httpd.conf):
<Directory /docroot>
  php_admin_value open_basedir /docroot 
</Directory>
Kdy╛ spustφte tent²╛ soubor script.php s timto nastavenφm open_basedir, dostanete tento v²sledek:
Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2

M∙╛ete takΘ vypnout jednotlivΘ funkce. Pokud p°idßme toto do souboru php.ini:
disable_functions readfile,system
zφskßme takov²to v²stup:
Warning: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2

Funkce omezenΘ/deaktivovanΘ v bezpeΦnΘm re╛imu

Toto je pravd∞podobn∞ ne·pln² a mo╛nß nesprßvn² p°ehled funkcφ omezen²ch v bezpeΦnΘm re╛imu.

Tabulka 23-1. Funkce omezenΘ v bezpeΦnΘm re╛imu

FunkceOmezenφ
dbmopen()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
dbase_open()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
filepro()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
filepro_rowcount()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
filepro_retrieve()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
ifx_*()sql_safe_mode restrictions, (!= safe mode)
ingres_*()sql_safe_mode restrictions, (!= safe mode)
mysql_*()sql_safe_mode restrictions, (!= safe mode)
pg_loimport()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
posix_mkfifo()Kontroluje, zda adresß°, ve kterΘm pracujete, mß stejnΘ UID jako spu╣t∞n² skript.
putenv()Obeys the safe_mode_protected_env_vars and safe_mode_allowed_env_vars ini-directives. Viz takΘ dokumentaci putenv()
move_uploaded_file()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
chdir()Kontroluje, zda adresß°, ve kterΘm pracujete, mß stejnΘ UID jako spu╣t∞n² skript.
dl()Tyto funkce jsou v bezpeΦnΘm re╛imu (safe-mode) deaktivovßny.
backtick operßtorTyto funkce jsou v bezpeΦnΘm re╛imu (safe-mode) deaktivovßny.
shell_exec() (funkΦnφ ekvivalent backticks)Tyto funkce jsou v bezpeΦnΘm re╛imu (safe-mode) deaktivovßny.
exec()M∙╛ete spou╣t∞t programy pouze uvnit° adresß°e safe_mode_exec_dir. Z praktick²ch d∙vod∙ nenφ momentßln∞ mo╛nΘ mφt v cest∞ k souboru s programem komponenty ...
system()M∙╛ete spou╣t∞t programy pouze uvnit° adresß°e safe_mode_exec_dir. Z praktick²ch d∙vod∙ nenφ momentßln∞ mo╛nΘ mφt v cest∞ k souboru s programem komponenty ...
passthru()M∙╛ete spou╣t∞t programy pouze uvnit° adresß°e safe_mode_exec_dir. Z praktick²ch d∙vod∙ nenφ momentßln∞ mo╛nΘ mφt v cest∞ k souboru s programem komponenty ...
popen()M∙╛ete spou╣t∞t programy pouze uvnit° adresß°e safe_mode_exec_dir. Z praktick²ch d∙vod∙ nenφ momentßln∞ mo╛nΘ mφt v cest∞ k souboru s programem komponenty ...
mkdir()Kontroluje, zda adresß°, ve kterΘm pracujete, mß stejnΘ UID jako spu╣t∞n² skript.
rmdir()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
rename()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript. Kontroluje, zda adresß°, ve kterΘm pracujete, mß stejnΘ UID jako spu╣t∞n² skript.
unlink()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript. Kontroluje, zda adresß°, ve kterΘm pracujete, mß stejnΘ UID jako spu╣t∞n² skript.
copy()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript. Kontroluje, zda adresß°, ve kterΘm pracujete, mß stejnΘ UID jako spu╣t∞n² skript. (pro source a target)
chgrp()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
chown()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript.
chmod()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript. Navφc nem∙╛ete nastavovat SUID, SGID a sticky bit
touch()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript. Kontroluje, zda adresß°, ve kterΘm pracujete, mß stejnΘ UID jako spu╣t∞n² skript.
symlink()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript. Kontroluje, zda adresß°, ve kterΘm pracujete, mß stejnΘ UID jako spu╣t∞n² skript. (pozn.: testovßn je pouze cφl)
link()Kontroluje, zda soubory/adresß°e, se kter²mi pracujete, majφ stejnΘ UID jako spu╣t∞n² skript. Kontroluje, zda adresß°, ve kterΘm pracujete, mß stejnΘ UID jako spu╣t∞n² skript. (pozn.: testovßn je pouze cφl)
getallheaders()V bezpeΦnΘm re╛imu nebudou hlaviΦky zaΦφnajφcφ 'authorization' (bez ohledu na velikost pφsmen) vraceny. Varovßnφ: toto nefunguje s aol-server implementacφ getallheaders()!
JakΘkoli funkce kterΘ pou╛φvajφ php4/main/fopen_wrappers.c ??