Modalità sicura (Safe mode)
PHP Manual

Sicurezza e Safe Mode

Direttive di configurazione della Modalità sicura e Sdella icurezza
Nome Default Modificabile Storico dei cambiamenti
safe_mode "0" PHP_INI_SYSTEM Removed in PHP 5.4.0.
safe_mode_gid "0" PHP_INI_SYSTEM Disponibile dal PHP 4.1.0. Rimosso din PHP 5.4.0.
safe_mode_include_dir NULL PHP_INI_SYSTEM Disponibile dal PHP 4.1.0. Rimosso in PHP 5.4.0.
safe_mode_exec_dir "" PHP_INI_SYSTEM Rimosso da PHP 5.4.0.
safe_mode_allowed_env_vars "PHP_" PHP_INI_SYSTEM Rimosso da PHP 5.4.0.
safe_mode_protected_env_vars "LD_LIBRARY_PATH" PHP_INI_SYSTEM Rimosso da PHP 5.4.0.
Per maggiori dettagli e definizioni sui modi PHP_INI_*, vedere Where a configuration setting may be set.

Breve descrizione dei parametri di configurazione.

safe_mode boolean

Abilita o disabilita la modalità sicura di PHP. Se PP è compilato con --enable-safe-mode è On di default, altrimenti è Off.

Avviso

Questa funzionalità è DEPRECATA dal PHP 5.3.0 e RIMOSSA dal PHP 5.4.0.

safe_mode_gid boolean

Di default, Safe Mode fa un controllo dell'UID all'apertura dei file. Se si vuole ridurre questo controllo al GID, abilitare safe_mode_gid. Decide se controllare l'UID (FALSE) o il GID (TRUE) al momento dell'accesso ai file.

safe_mode_include_dir string

I controlli UID/GID non vengono effettuati quando si includono i file da questa cartella o dalle sue sottocartelle (la cartella deve essere presente anche in include_path oppure occorre includere il percorso completo).

Dal PHP 4.2.0, questa direttiva puà ricevere un percorso separato da due punti (o punto e virgola nei sistemi Windows) come nel caso del parametro include_path, piuttosto che solo una cartella. La restrizione specificata è un prefisso, non un nome di cartella. Ciò significa che "safe_mode_include_dir = /dir/incl" permette l'accesso anche a "/dir/include" e "/dir/incls" se esistono. Quando si vuole restringere l'accesso solo alla cartella specificata, apporre uno slash. Per esempio: "safe_mode_include_dir = /dir/incl/" Se il valore di questo parametro è vuoto, nessun file con UID/GID differenti possono essere inclusi in PHP 4.2.3 e dal PHP 4.3.3. Nelle versioni precedenti, tutti i file potevano essere inclusi.
safe_mode_exec_dir string

Se PHP è usato in modalità sicura, system() e le altre funzioni che eseguono comandi di sistema si rifiutano di eseguire programmi che non siano in questa cartella. Occore usare il simbolo / come separatore di cartelle in tutti gli ambientim incluso Windows.

safe_mode_allowed_env_vars string

L'impostazione di alcune variabile d'ambiente può essere una potenziale violazione di sicurezza. Questo parametro contiene una lista di prefissi separati da virgole. In Safe Mode, l'utente può modificare solo quelle variabili d'ambiente il cui nome comincia con i prefissi indicati. Di default, gli utenti possono impostare solo le variabili d'ambiente che cominciano con PHP_ (esempio PHP_FOO=BAR).

Nota:

Se questo parametro è vuoto, PHP permettera all'utilizzatore di modificare QUALSIASI variabile d'ambiente!

safe_mode_protected_env_vars string

Questo parametro contiene una lista (separata da virgole) di variabili d'ambiente che l'utilizzatore finale non può cambiare usando putenv(). Queste variabili saranno protette anche se safe_mode_allowed_env_vars permette la loro modifica.

Vedere anche: open_basedir, disable_functions, disable_classes, register_globals, display_errors e log_errors.

Quando safe_mode è attiva (on), il PHP verifica se il proprietario dello script in esecuzione e il proprietario del file su cui si sta operando con una funzione sui file coincidono. Per esempio:

-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
Eseguendo questo script.php:
<?php
 readfile
('/etc/passwd'); 
?>
si ottiene questo errore quando Safe Mode è abilitata:
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

Comunque, possono esistere ambienti in cui un controllo rigido di UID è troppo restrittivo, e un controllo sul GID è sufficiente. Questo è supportato dal parametro safe_mode_gid. Impostandolo a On si ottene il controllo su GID, impostandolo a Off si ha il controllo (di default) su UID.

Se, invece di safe_mode, viene definita una directory open_basedir allora tutte le operazioni sui file saranno limitate ai file sottostanti la directory specificata. Per esempio (nel file httpd.conf di Apache):

<Directory /docroot>
  php_admin_value open_basedir /docroot 
</Directory>
Se si esegue lo stesso script.php con questa impostazione di open_basedir si ottiene come risultato:
Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2 

È possibile inoltre disabilitare le singole funzioni. Si note che il parametro disable_functions non può essere usato al di fuori di php.ini, il che significa che non si puossono disabilitare le funzioni in base al virtualhost o alla cartella nel file httpd.conf. Se si aggiunge la seguente riga al file php.ini:

disable_functions = readfile,system
si ottiene:
Warning: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2 

Avviso

Queste restrizioni di PHP non si applicano ovviamente sui file binari eseguiti.


Modalità sicura (Safe mode)
PHP Manual