Rozdzia│ 22. Tryb bezpieczny

Spis tre╢ci
Funkcje ograniczone/wy│▒czone w trybie bezpiecznym

Tryb bezpieczny (safe mode) jest pr≤b▒ rozwi▒zania problem≤w bezpiecze±stwa na wsp≤│dzielnym serwerze. Co prawda rozwi▒zywanie ich na poziomie PHP nie jest najlepszym rozwi▒zaniem, ale je╢li nie ma mo┐liwo╢ci zrobienia tego na poziomie serwera www lub systemu operacyjnego, na wielu serwerach, zw│aszcza u us│ugodawc≤w internetowych, u┐ywa siΩ trybu bezpiecznego.

Dyrektywy konfiguracyjne odpowiadaj▒ce za tryb bezpieczny:
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_functions =

Gdy opcja safe_mode jest w│▒czona, PHP sprawdza czy w│a╢cicielem pliku na kt≤rym na kt≤rym funkcja chce operowaµ i w│a╢cicielem uruchamianego skryptu jest ten sam u┐ytkownik. Na przyk│ad:
-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
Uruchomienie script.php
<?php
 readfile('/etc/passwd');
?>
z uruchomionym trybem bezpiecznym spowoduje wy╢wietlenie b│Ωdu:
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

Je╢li zamiast w│▒czaµ opcjΩ safe_mode ustawisz katalog open_basedir, wtedy wszystkie operacje plikowe bed▒ ograniczone do tego katalogu. Na przyk│ad (dla httpd.conf Apache'a):
<Directory /docroot>
php_admin_value open_basedir /docroot
</Directory>
Uruchomienie tego samego skryptu script.php z ustawionym katalogiem open_basedir spowoduje wy╢wietlenie:
Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/script.php on line 2

Mo┐esz tak┐e wy│▒czyµ pojedyncze funkcje. PamiΩtaj jednak, ┐e dyrektywa disable_functions mo┐e byµ u┐yta tylko w pliku php.ini, co oznacza, ┐e nie da siΩ wy│▒czaµ funkcji w sekcjach VirtualHost i Directory w pliku httpd.conf. Je╢li do pliku php.ini dodasz:
disable_functions readfile,system
po uruchomieniu skryptu otrzymasz:
Warning: readfile() has been disabled for security reasons in
/docroot/script.php on line 2

Funkcje ograniczone/wy│▒czone w trybie bezpiecznym

Jest to najprawdopodobniej wci▒┐ niekompletna lista funkcji ograniczonych przez tryb bezpieczny.

Tabela 22-1. Funkcje ograniczone w trybie bezpiecznym

FunkcjaOgraniczenia
dbmopen()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
dbase_open()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
filepro()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
filepro_rowcount()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
filepro_retrieve()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
ifx_*()Podlega ograniczeniom narzuconym przez sql_safe_mode, (!= tryb bezpieczny)
ingres_*()Podlega ograniczeniom narzuconym przez sql_safe_mode, (!= tryb bezpieczny)
mysql_*()Podlega ograniczeniom narzuconym przez sql_safe_mode, (!= tryb bezpieczny)
pg_loimport()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
posix_mkfifo()Sprawdza, czy katalog, na kt≤rym chesz operowaµ, ma takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
putenv()Podlega dyrektywom safe_mode_protected_env_vars i safe_mode_allowed_env_vars w php.ini. Zobacz r≤wnie┐ dokumantacjΩ do putenv()
move_uploaded_file()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
chdir()Sprawdza, czy katalog, na kt≤rym chesz operowaµ, ma takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
dl()Ta funkcja jest niedostΩpna w trybie bezpiecznym
lewy apostrofTa funkcja jest niedostΩpna w trybie bezpiecznym
shell_exec() (funkcja r≤wnowa┐na z lewym apostrofem)Ta funkcja jest niedostΩpna w trybie bezpiecznym
exec()Mo┐esz uruchamiaµ programy jedynie z katalogu zdefiniowanego dyrektyw▒ safe_mode_exec_dir. Ze wzglΩd≤w praktycznych obecnie nie ma mo┐liwo╢ci stosowania .. w ╢cie┐ce do programu.
system()Mo┐na uruchamiaµ programy jedynie z katalogu zdefiniowanego dyrektyw▒ safe_mode_exec_dir. Ze wzglΩd≤w praktycznych obecnie nie ma mo┐liwo╢ci stosowania .. w ╢cie┐ce do programu.
passthru()Mo┐na uruchamiaµ programy jedynie z katalogu zdefiniowanego dyrektyw▒ safe_mode_exec_dir. Ze wzglΩd≤w praktycznych obecnie nie ma mo┐liwo╢ci stosowania .. w ╢cie┐ce do programu.
popen()Mo┐na uruchamiaµ programy jedynie z katalogu zdefiniowanego dyrektyw▒ safe_mode_exec_dir. Ze wzglΩd≤w praktycznych obecnie nie ma mo┐liwo╢ci stosowania .. w ╢cie┐ce do programu.
mkdir()Sprawdza, czy katalog, na kt≤rym chesz operowaµ, ma takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
rmdir()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
rename()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. Sprawdza, czy katalog, na kt≤rym chesz operowaµ, ma takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
unlink()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. Sprawdza, czy katalog, na kt≤rym chesz operowaµ, ma takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
copy()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. Sprawdza, czy katalog, na kt≤rym chesz operowaµ, ma takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. (dla ╝r≤d│a i przeznaczenia)
chgrp()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
chown()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
chmod()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. Dodatkowo, nie mo┐na ustawiµ bit≤w SUID, SGID i sticky bit.
touch()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. Sprawdza, czy katalog, na kt≤rym chesz operowaµ, ma takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany.
symlink()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. Sprawdza, czy katalog, na kt≤rym chesz operowaµ, ma takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. (sprawdzany jest jedynie element do kt≤rego tworzony jest link)
link()Sprawdza czy plik(i)/katalogi, na kt≤rych chcesz operowaµ, maj▒ takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. Sprawdza, czy katalog, na kt≤rym chesz operowaµ, ma takie same UID jak skrypt, kt≤ry jest aktualnie wykonywany. (sprawdzany jest jedynie element do kt≤rego tworzony jest link)
getallheaders() W tybie bezpiecznym, nag│owki zaczynaj▒ce siΩ od 'authorization' (wielko╢µ liter bez znaczenia) nie bΩd▒ zwracane. Uwaga: w implementacji dla serwera AOL ta funkcjonalno╢µ jest uszkodzona
Ka┐da funkcja korzystaj▒ca z php4/main/fopen_wrappers.c ??