Segurança e o modo seguro (safe mode)
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).
AvisoEsta 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.