Segurança e o modo seguro (safe mode)

Segurança e o modo seguro (safe mode) diretivas de configuração
Nome Padrão Modificável Changelog
safe_mode "0" PHP_INI_SYSTEM Removido no PHP 5.4.0.
safe_mode_gid "0" PHP_INI_SYSTEM Removido no PHP 5.4.0.
safe_mode_include_dir NULL PHP_INI_SYSTEM Removido no PHP 5.4.0.
safe_mode_exec_dir "" PHP_INI_SYSTEM Removido no PHP 5.4.0.
safe_mode_allowed_env_vars "PHP_" PHP_INI_SYSTEM Removido no PHP 5.4.0.
safe_mode_protected_env_vars "LD_LIBRARY_PATH" PHP_INI_SYSTEM Removido no PHP 5.4.0.
Para mais detalhes e definições dos modos PHP_INI_*, veja Onde uma configuração deve ser definida.

Uma rápida explicação das diretivas de configuração.

safe_mode boolean

Independente se o "safe mode" estiver habilitado. Se o PHP for compilado com --enable-safe-mode o padrão sempre será On (habilitado), caso contrário, Off (desabilitado).

Aviso

Esta funcionalidade tornou-se OBSOLETA desde o PHP 5.3.0 e foi REMOVIDA desde o PHP 5.4.0.

safe_mode_gid boolean

Por padrão, o "safe mode" faz uma comparação UID quando abre arquivos. Se você preferir ser menos restrito e usar uma comparação por GID, você pode habilitar o safe_mode_gid. Usar UID (FALSE) ou GID (TRUE) fara a verificação no acesso aos arquivos.

safe_mode_include_dir string

As verificações de UID/GID são ignoradas quando se está incluindo arquivos desse diretório e seus subdiretórios (o diretório tem que estar no include_path ou o caminho completo tem que ser incluído).

Esta diretiva pode receber vírgulas (ou ponto e vírgula para o Windows) para separar múltiplos caminhos do mesmo jeito que a diretiva include_path, em vez de uma única pasta. A restrição especificada é na verdade um prefixo, e não o nome de um diretório. Isso significa que "safe_mode_include_dir = /dir/incl" permite acessar tanto o diretório "/dir/include" quanto o "/dir/incls" se eles existirem. Quando você quiser restringir o acesso apenas a um diretório exclusivo, termine a configuração com uma barra. Exemplo: "safe_mode_include_dir = /dir/incl/" Se o valor da diretiva estiver vazio, nenhum arquivo com UID/GID diferente pode ser incluído.
safe_mode_exec_dir string

Se o PHP utiliza o "safe mode", system() e outras funções que executam programas do sistema podem se recusar a iniciar programas fora desse diretório. Deve-se utilizar a / (barra) como separador de diretórios em todos os ambientes, inclusive no Windows.

safe_mode_allowed_env_vars string

Configurar algumas varíaveis de ambiente pode causar brechas na segurança. Esta diretiva contém uma lista de prefixos separada por vírgula. No modo seguro, o usuário somente pode alterar varíaveis cujos nomes comecem com os prefixos definidos aqui. Por padrão, os usuários só poderão definir variáveis de ambiente que comecem com PHP_ (e.g. PHP_FOO=BAR).

Nota:

Se esta diretiva estiver vazia, o PHP deixará que o usuário modifique QUALQUER variável de ambiente!

safe_mode_protected_env_vars string

Está diretiva contém uma lista de varíaveis de ambiente, separadas por vírgula, as quais o usuário final não poderá modificar usando putenv(). Estas variáveis serão protegidas mesmo se o safe_mode_allowed_env_vars estiver configurado para permitir modificá-las.

Veja também: open_basedir, disable_functions, disable_classes, register_globals, display_errors, and log_errors.

Quando safe_mode está habilitado, o PHP verifica se o dono do script atual corresponde ao dono do arquivo a ser usado por uma função de arquivo ou seu diretório. Por exemplo:

-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
Executar script.php:
<?php
 readfile
('/etc/passwd'); 
?>
gera este erro quando "safe mode" estiver habilitado:
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

No entanto, podem existir ambientes onde uma verificação UID estrita não é apropriada e uma verificação flexível GID é suficiente. Isso é suportado por meio da chave safe_mode_gid. Definir como On faz a verificação flexível GID, definir como Off (o padrão) faz a verificação UID.

Se em vez do safe_mode, você configurar um diretório open_basedir todas as operações com arquivos ficarão limitadas aos arquivos nessa pasta específica. Por exemplo (Apache httpd.conf):

<Directory /docroot>
  php_admin_value open_basedir /docroot 
</Directory>
Se rodar o mesmo script.php com a configuração de open_basedir o resultado será o seguinte:
Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2 

Você também pode desabilitar funções individuais. Veja que a diretiva disable_functions não pode ser utilizada fora do arquivo php.ini, o que significa que não se pode desabilitar funções por virtualhost ou por diretório através de seu arquivo httpd.conf. Se adicionarmos o seguinte no seu arquivo php.ini:

disable_functions = readfile,system
Teremos a seguinte saída:
Warning: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2 

Aviso

Claramente estas restrições do PHP não são válidas para binários executados.

add a note add a note

User Contributed Notes 3 notes

up
7
rayro at gmx dot de
9 years ago
Theres a failure with open_basedir and per-host configuration
in apache as described in bug #42836: http://bugs.php.net/bug.php?id=42836

I got the same errors on my development windows system and apache 2.2.4 with php 5.3.beta1.

This error (or similar) is shown:
Warning: Unknown: open_basedir restriction in effect. File(...)
is not within the allowed path(s): (� �� �@5�,�)

Fix:
  - try slashes at the end of the folder name
  or
  - put "php_admin_value open_basedir ..." at first of all in the configuration
up
0
Anonymous
1 month ago
Whether to enable PHP's safe mode. If PHP is compiled with --enable-safe-mode then defaults to On, otherwise Off. http://www.wikibanat.com
up
0
Anonymous
2 months ago
bad/missing config values for the Plesk server running the whole thing. I just followed the directions here: https://vb.3dlat.com/

You can configure PHP to have a separate error log file for each VirtualHost definition. The trick is knowing exactly how to set it up, because you can’t touch the configuration directly without breaking Plesk. Every domain name on your (dv) has its own directory in /var/www/vhosts. A typical directory has the following top level directories:

cgi-bin/
conf/
error_docs/
httpdocs/
httpsdocs/
...and so on

You’ll want to create a vhost.conf file in the domain directory’s conf/ folder with the following lines:

php_value error_log /path/to/error_log
php_flag display_errors off
php_value error_reporting 6143
php_flag log_errors on

Change the first value to match your actual installation (I used /tmp/phperrors.log). After you’re done editing the vhost.conf file, test the configuration from the console with:

apachectl configtest
…or if you don’t have apachectl (as Plesk 8.6 doesn’t seem to)…

/etc/init.d/httpd configtest

And finally tell Plesk that you’ve made this change.

/usr/local/psa/admin/bin/websrvmng -a
To Top