Desenvolvimento - PHP

Safe mode - Modo seguro no PHP

O Safe mode é uma boa tentativa de se tornar mais seguro ou de simplesmente melhorar o nivel de segurança das aplicações escritas em PHP.

por Leo Genilhu



O Safe mode é uma boa tentativa de se tornar mais seguro ou de simplesmente melhorar o nivel de segurança das aplicações escritas em PHP. Através desse parametro no php.ini o script php pode checar em tempo de execução o owner do arquivo que esta sendo executado, manipulando assim informações do proprio servidor e diretorio.

Nota: Quando o safe-mode está ativo, o PHP verifica se o(s) arquivo(s) e/ou diretório(s) que serão afetados por esta operação tem o mesmo UID (proprietário) do script que está sendo executado.

Isso é um problema crônico principalmente em servidores compartilhado onde os varios usuários executam scripts no apache. Os efeitos colaterais dessa configuração é geralmente nas ferramentas de gravação de arquivos no servidor atraves de uploads, porque normalmente essas ferramentas usa am a função copy() e/ou a função move_upload_file() que fica bloqueada ao UIN do usuario que executa o php. Ou seja se o php.ini não estiver bem configurado ambas poderam não funcionar.

Quando o safe_mode está ligado, o PHP checa se o proprietário do script atual bate com o proprietário do arquivo a ser operado por uma função de arquivo. 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

Executando esse script.php

<?php
 readfile("/etc/passwd"); 
?> 

resulta nesse erro quando o modo seguro 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 entando, em certos ambientes uma checagem rígida de UID não é apropriada e uma checagem mais leve de GID é suficiente. Isso é suportado através da diretiva safe_mode_gid. Atribuindo a ela o valor On que faz a checagem de GID, mais leve e atribuindo a ela o valor Off (o padrão) faz a checagem UID.

Se, ao invés de safe_mode, você editou um diretório em open_basedir, então todas as operações de arquivos serão limitadas a arquivos no diretório especificado e seus subdiretórios. Por exemplo

 (httpd.conf    do Apache de exemplo): 

<Directory /docroot>
  php_admin_value open_basedir /docroot 
</Directory>

Se você rodar o mesmo script.php com essa configuração de open_basedir então esse será o resultado:

Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2

Ou seja será gerado um Warning avisando das restrições deste diretorio.

Para desabilitar estas funções individualmente você pode usar a directiva disable_functions.

Ela permite que você desabilite algumas funções por razões de segurança. Nela você passa uma lista de nomes de funções separadas por vírgula. disable_functions não é afetada pela diretiva Safe Mode.

disable_functions readfile,system

Essa diretiva é configurada no php.ini

Bom espero ter ajudado com algumas informações sobre safe_mode e direcivas de segurança. Qualquer duvida me envie um email estarei a disposição para ajudar.

Um abraço a todos e até a proxima.

Leo Genilhu

Fonte
manual do PHP.
http://br2.php.net/manual/

Leo Genilhu

Leo Genilhu - Atua como consultor de desenvolvimentos e aplicações em web/wireless, sendo analista de uma empresa de desenvolvimento.
Além disso participa de comunidades de linux e software livre. Mantedor de lista de discussão em php e linux.