-
Configuração do PHP: Avançado
Posted on February 20th, 2009 2 commentsAlgumas configurações do PHP.INI são extremamente importantes - e necessitam de um maior estudo para evitar furos em seu servidor PHP que possam ser usados e explorados por hackers e possíveis invasores.
Sintaxe: display_errors = [ On I Off ]
Com display_errors = 0n serão exibidas mensagens de alerta no decorrer da exibição do resultado do código PHP, ou seja, eventuais erros ou warnings gerados pelo script serão exibidos pelo browser juntamente com a página web.
Essa diretriz pode ser potencialmente explorada, mas ela possui duas faces que precisam ser atenciosamente analisadas.
A primeira face é que, em um servidor de desenvolvimento, essa diretriz precisa estar configurada com o valor On, pois é praticamente impossível desenvolver um sistema sem saber em que local estão ocorrendo eventuais problemas ao longo do código.
Já o segundo aspecto que precisamos conhecer é que em um servidor de produção essa diretriz precisa estar configurada como Off, pois informações relevantes sobre o funcionamento de seu script podem ser reveladas por intermédio de um erro exibido. Imagine as conseqüências da divulgação de caminhos e nomes de arquivos do servidor web, nomes de usuários, estruturas de tabelas em SQL, dados do servidor e outras informações sigilosas que podem ser reveladas por uma mensagem de erro.
Sintaxe: log_errors = [ On | Off ]
Essa diretriz é um complemento para display_errors. Habilite log_errors para que qualquer erro ocorrido durante a execução do script seja registrado. As mensagens de log serão gravadas no arquivo de erro do servidor Apache.
É importante manter essa diretriz sempre ativa em ambientes de produção, pois somente dessa forma será possível tomar conhecimento de problemas que estejam ocorrendo com a execução do script.
No ambiente de produção, quando display_errors estiver com valor igual a Off, será possível acompanhar possíveis erros gerados pelo script somente se log_errors estiver com valor igual a On. Isso é excelente, pois torna possível o debug de um programa sem publicar informações exibidas pelas mensagens de erro, garantindo a segurança das informações tratadas pelo script.
Dessa forma, log_errors não precisa ser habilitada em um ambiente de desenvolvimento pois as mensagens já estarão sendo exibidas na tela por conta da diretriz display_errors, a menos que seja, por alguma razão, necessário armazenar o histórico de log de erros.
Sintaxe: error_reporting = [ E_ALL &
Essa diretriz é responsável por definir o volume de logs que serão reportados. A seguir temos uma lista com alguns dos possíveis níveis suportados por essa diretriz.
E ALL - Todos os erros e mensagens de alerta (warnings), exceto os reportados pelo nível E_STRICT.
E_ERROR - Erros fatais durante a execução do script. Indica erros que não podem ser ignorados e, ao encontrar um erro desse nível, a execução do script é interrompida imediatamente.
E_WARNING - Mensagens de alerta que podem ocorrer durante a execução. Por não serem erros fatais, a execução do script não é interrompida.
E_PARSE - Erros originados pelo interpretador PHP
E_NOTICE - Avisos durante a execução. Indica problemas não-intencionais, como o uso de uma variável não-iniciada; a execução do script não é interrompida.
E_STRICT - Mais avisos durante a execução. Este nível habilita o PHP a sugerir mudanças no código para assegurar a interoperabilidade do código com versões posteriores do PHP
E_CORE_ERROR - Mensagens de erro que podem ocorrer na iniciação do PHP; trata-se de mensagens do próprio núcleo do PHP
E_CORE_WARNING - Mensagens de alerta (warnings) do próprio núcleo do PHP geradas durante a iniciação.
E_COMPILE_ERROR - Erro fatal durante a compilação. Este nível é parecido com E_ERROR, com a diferença de ser gerado pelo Zend Scriping Engine.
E_COMPILE_WARNING - Mensagem de alerta gerada durante a compilação. Este nível é semelhante ao nível E_WARNING, com a diferença de ser gerado pelo Zend Scripting Engine.
É recomendável o uso dessa diretriz com os seguintes níveis habilitados:
error_reporting = E_ALL I E_STRICT
Dessa forma, serão reportados todos os tipos de mensagens de erro, avisos e mensagens com dicas de melhoria de código.
Sintaxe: error_log = [ filename | syslog ]
Define o nome do arquivo em que os erros do script serão registrados.
Se o valor especial syslog for usado, os erros são enviados para o log do sistema, o qual, em muitas distribuições Linux, poderá ser gravado em Bar/ log/messages o u em /var/log/syslog.
É importante ficar atento às permissões de acesso do arquivo de log, de forma que apenas o servidor web e o administrador do sistema possam ler e escrever esse arquivo. As informações armazenadas nesse arquivo não podem cair em mãos erradas.
Sintaxe: disable_functions =
Essa diretriz oferece a capacidade de desabilitar funções. Isso pode ser usado, entre outras coisas, para aprimorar a segurança, mas essa diretriz pode ser especialmente útil se um gerente de projeto não quiser que seus desenvolvedores utilizem determinadas funções.
É possível definir várias funções para serem desabilitadas separando-as por vírgula.
Sintaxe: disable_classes =
Semelhantemente à diretriz anterior disable_classes, pode ser usada para desabilitar classes. É possível definir várias classes para serem desabilitadas separando-as por vírgula.
Sintaxe: expose_php = [ On I Off ]
A problemática tratada por essa diretriz talvez esteja mais relacionada com privacidade do que com a segurança propriamente dita. Com expose_php habilitada, será possível determinar se o PHP está instalado no servidor. Isso pode ser feito com uma consulta ao servidor web.
Habilitando essa diretriz, a versão do PHP também ficará exposta. Em um caso extremo de haver algum exploit com alguma versão em específico do PHP, essa informação pode ser valiosa para pessoas mal intencionadas. Por essa razão é recomendável que essa diretriz esteja em Off.
A seguir temos o resultado da interação feita com o servidor web via Telnet, que exemplifica como testar o estado em que está configurado o expose_php. Neste caso, essa diretriz está configurada com o valor On.
$ telnet localhost 80 Trying 127.0.0.1… Connected te localhost. Escape character is ‘A]’. HEAD / HTTP/1.0
HTTP/1.1 200 OK Date: Sun, 12 Aug 2007 01:33:33 GMT Server: Apache/2.2.3 (Distro) PHP/5 .2.1 X-Powered-By: PHP/5.2.1 Connection: close Content-Type: text/html; charset=IS0-8859-1
Connection closed by foreign host.
Entenda que não adianta configurar expose_php = 0ff e ao mesmo tempo fazer chamadas na URL em seu website por arquivos com a extensão php. Seria como querer andar despercebido trajando um terno cor de rosa.
Sintaxe: upload_max_filesize = 2M
Define o tamanho máximo de arquivos para upload. Assim como quando se recebe informação por um formulário ou via um método, é importante filtrar também arquivos recebidos. Um primeiro filtro é definir o tamanho máximo dos arquivos com essa diretriz. Além disso, é importante estabelecer meios de definir se o arquivo é do tipo esperado ou se ele foi transmitido corretamente. Outra checagem importante e verificar se o arquivo contém códigos maliciosos ou até mesmo vírus, para tanto, consulte o Tópico 10.1.
Atente também para as outras diretrizes do arquivo de configuração do PHP, como, por exemplo, post_max_size e mssql.textsize, as quais, quando bemdefinidas, podem evitar problemas de sobrecarga do servidor e, dessa forma, prevenir que ataques de DoS sejam bem-sucedidos.
É interessante também prestar atenção em diretrizes como memory_limit, max_executi on_ti me e max_i nput_time, que sao diretrizes muito importantes em uma configuração do PHP com objetivo de aprimorar a segurança do sistema.
Sintaxe: incl ude_path =
Especifica a lista de diretórios em que a função include() e suas variantes procurarão o arquivo.
O formato é como a variável de ambiente PATH do Unix, uma lista de diretórios separados por dois-pontos. Em sistemas Windows os diretórios são separados por ponto-e-vírgula.
A função set_i ncl ude_path () tem a mesma finalidade que a diretriz i ncl ude_path e pode ser usada ao longo do programa.
Outras diretrizes Importantes
As diretrizes de configuração do PHP que têm influência direta com a segurança foram as mencionadas anteriormente. Provavelmente em novas versões do PHP haverá inovações nesse sentido, por essa razão é muito bom ficar atento a novos recursos adicionados. Obviamente o exemplo anterior é muito simplório, e as informações que devem ou não ser exibidas precisam ser definidas com cautela pelo desenvolvedor.
O mais recomendável é direcionar a saída para um arquivo:
<?php
set_error_handler(’custom_error’);
$int20 = 20; $strola = “ol a”; echo (Si nc22);
function custom_error ($errno, $errstr, Serrfile, $errline, $errcontext) { $message = “Erro $errno: Serrstrn”; $message .= “Arquivo: se r rfi 1 en “; $message .= “Linha: Serrlinen”; $message .= “Contexto: ” . print_r(Serrcontext, TRUE) . “n”; error_log ($message, 3, “/tmp/erros.log”); }
?>
Talvez o seu sistema em PHP esteja hospedado num servidor compartilhado com vários outros sistemas de terceiros. Neste caso certamente a empresa de hospedagem não permitirá que as diretrizes de configuração do PHP sejam alteradas, afinal isso poderia causar problemas para seus clientes.
Nesses casos é possível usar a função ini_set().
A função ini_set() pode ser usada para definir valores às diretrizes de configuração do PHP, e esses valores serão válidos apenas durante a execução do script. Dessa forma, é interessante manter as configurações das diretrizes em um arquivo separado e incluí-lo no
Início da execução do programa com a função include().
Segue um exemplo de utilização do ini_set():
<?php ini_set(’display_errors’~ ‘Off’); ini_set(’log_errors’, ‘On’); ini_set(’error_log’, ‘../logs/php_error.log’); ?>
Na função i ni_set() são imputados dois parametros - o primeiro é a diretriz de configuração, e o segundo é o valor que será atribuído a diretriz.
Nem todas as diretrizes do PHP estão disponíveis para serem alteradas por ini_set().
Arquivo PHP.INI arquivo PHP.INI, disable_classes, disable_functions, display_errors, error_log, error_reporting, expose_php, incl ude_path, log_errors, upload_max_filesize2 responses to “Configuração do PHP: Avançado”
-
Marco Leandro do Prado May 14th, 2009 at 11:52
Olá como faço para entrar em contato com vocês?
Não encontrei nenhum formulário de contato no site.Att.
-
Marco, pode enviar um email ao alexandre.duran@meganick.com.br
Leave a reply
-

