Zabezpieczenia i tryb bezpieczny
Szczegóły i definicje dotyczące działania
PHP_INI_* znajdują się w rozdziale
Where a configuration setting may be set.
Oto krótkie wyjaśnienie dyrektyw
konfiguracji.
-
safe_mode
boolean
-
Określa czy należy włączyć w PHP tryb bezpieczny.
Jeśli PHP zostało skompilowane z parametrem --enable-safe-mode
to domyślną wartością jest On. W przeciwnym przypadku domyślną wartością jest Off.
OstrzeżenieTa opcja jest
PRZESTARZAŁA od PHP 5.3.0 i została USUNIĘTA
w PHP 5.4.0.
-
safe_mode_gid
boolean
-
Domyślnie tryb bezpieczny sprawdza, czy właścicielem uruchamianego skryptu
lub pliku, do którego funkcja chce uzyskać dostęp, jest ten sam użytkownik (UID).
Jeśli chcemy aby porównywana dotyczyły całej grupy (GID), należy włączyć safe_mode_gid.
Określa czy używać UID (FALSE
) lub
GID (TRUE
) podczas sprawdzania dostępu do pliku.
-
safe_mode_include_dir
string
-
Sprawdza czy nie nastąpiło obejście UID/GID
podczas dołączania plików z tego katalogu i jego podkatalogów (ścieżka do katalogu
powinna być podana w include_path
lub też powinna być dołączona pełna nazwa ścieżki).
Ta dyrektywa może zawierać dwukropek (w Windows
średnik) oddzielający ścieżki, podobnie jak w przypadku dyrektywy
include_path,
a nie tylko pojedyńczy katalog.
Rejestrowanie ścieżki określane jest obecnie przez przedrostek, a nie
nazwę katalogu. To oznacza, że "safe_mode_include_dir = /dir/incl" pozwala
uzyskać dostęp do "/dir/include" i "/dir/incls" (jeżeli istnieją).
Gdy chcemy ograniczyć dostęp tylko do określonego katalogu, dodajemy
na końcu ukośnik. Na przykład: "safe_mode_include_dir = /dir/incl/"
Jeśli wartość dyrektywy jest pusta, to żadne pliki - inne niż należące do
UID/GID nie mogą być dołączone.
-
safe_mode_exec_dir
string
-
Jeśli PHP działa w trybie bezpiecznym, system() i inne
funkcje wykonujące programy systemowe
otrzymają odmowę uruchomienia programów, tych które nie znajdują się w tym katalogu.
Używamy / jako separatora katalogu dla wszystkich środowisk,
włącznie z Windows.
-
safe_mode_allowed_env_vars
string
-
Ustawienie pewnych zmiennych środowiskowych może być potencjalnym naruszeniem bezpieczeństwa.
Ta dyrektywa zawiera listę przedrostków oddzielonych przecinkami. W trybie bezpiecznym
użytkownik może wyłącznie zmieniać zmienne środowiskowe, których nazwy zaczynają się
od przedrostków tutaj wymienionych. Domyślnie użytkownicy mają tylko możliwość ustawiania
zmiennych środowiskowych zaczynających się od PHP_
(np. PHP_FOO=BAR).
Informacja:
Jeśli ta dyrektywa jest pusta, PHP pozwoli użytkownikowi zmieniać WSZYSTKIE
zmienne środowiskowe!
-
safe_mode_protected_env_vars
string
-
Ta dyretywa zawiera listę zmiennych środowiskowych oddzielonych
przecinkami, których użytkownik końcowy nie może zmienić za pomocą
putenv(). Te zmienne są zawsze chronione
nawet jeśli safe_mode_allowed_env_vars pozwala na ich zmianę.
Patrz także: open_basedir,
disable_functions,
disable_classes,
register_globals,
display_errors,
i log_errors.
Gdy opcja safe_mode jest włączona, PHP sprawdza
czy właścicielem wykonywanego skryptu jest właściciel pliku, na którym chce
operować funkcja, lub czy jest to katalog tego samego użytkownika. 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');
?>
zwraca błąd jeśli tryb bezpieczny jest włączony:
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
Jednakże mogą być środowiska, gdzie zbyt restrykcyjna weryfikacja UID
nie jest stosownym rozwiązaniem, a łagodniejsze sprawdzanie GID jest
w pełni wystarczające. Można to zmienić za pomocą safe_mode_gid. Ustawienie tej opcji na
On włącza łagodniejsze sprawdzanie GID,
a ustawienie na Off (domyślnie) przełącza na
sprawdzanie UID.
Jeśli zamiast safe_mode ustawiamy
katalog open_basedir wtedy wszystkie
operacje na plikach będą ograniczone do plików znajdujących się w nim.
Na przykład (Apache httpd.conf):
<Directory /docroot>
php_admin_value open_basedir /docroot
</Directory>
Jeśli uruchominy plik
script.php z ustawieniem
open_basedir
wówczas otrzymamy wynik:
Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/script.php on line 2
Możemy wyłączyć obsługę wybranych funkcji. Zauważmy, że dyrektywa
disable_functions
nie może być ustawiana poza plikiem php.ini co oznacza, że
nie możemy wyłączyć funkcji dla wybranego wirtualnego hosta lub katalogu
zdefiniowanego w pliku httpd.conf.
Jeśli dodamy następującą dyrektywę do naszego pliku php.ini:
disable_functions = readfile,system
Otrzymamy następujący wynik:
Warning: readfile() has been disabled for security reasons in
/docroot/script.php on line 2
Ostrzeżenie
Naturalnie restrykcje PHP nie obowiązują w plikach wykonywalnych.