Forum und email
Bezpečný režim

Kapitola 42. 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 42-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 ??