International PHP Conference 2015

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.

Here's a short explanation of the configuration directives.

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 1 note

up
3
rayro at gmx dot de
6 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
To Top