PHP Comandos e Configurações Básicas - Programação PHP e Hospedagem de Sites em PHP com Scripts PHP
RSS icon Home icon
Receba DINHEIRO DIARIAMENTE na Conta BANCÁRIA
  • Configuração do PHP: Avançado

    Posted on February 20th, 2009 Sites 2 comments

    Algumas 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().

    VN:F [1.3.1_645]
    Rating: 8.8/10 (5 votes cast)
    • Share/Save/Bookmark
  • A configuração register_globals

    Posted on February 20th, 2009 Sites No comments

    Algumas configurações de um Servidor de Hospedagem com PHP são importantíssimas no que diz respeito a segurança e integridade de todo o sistema. Trabalhar com cuidado estas configurações no PHP.INI podem preservar seu projeto e seus scripts PHP.

    A principal configuração do sistema e a que causa maior problemas em relação a possíveis falhas de segurança gerada em scripts PHP é sem dúvida é o uso do register_globals. Aqui vamos nos estender mais do que apenas listar as diretivas, mas também propor soluções em sua programação para que você não tenha problemas com seus SCRIPTS PHP.

    Sintaxe: register_globals = [ On I Off ]

    A diretriz register_globals tem a função de registrar automaticamente variáveis que foram enviadas pelos métodos POST, GET e pelo uso de cookies.

    Essa diretriz não representa um problema de segurança no PHP, porém pode proporcionar potenciais riscos à segurança do sistema por induzir o desenvolvedor ao erro. Não existe uma boa razão para habilitar essa diretriz e, de modo geral, register_globals deve permanecer sempre com o valor Off.

    A partir da versão 4.2 do PHP, essa diretriz foi desabilitada no arquivo PHP.INI padrão e até então essa pequena alteração tem gerado muitas dores de cabeça para desenvolvedores PHP que mantêm scripts antigos, pois é muito comum encontrar códigos que foram escritos sem nenhuma preocupação com relação ao registro de variáveis. O problema ocorre quando é feita uma atualização do PHP de versões anteriores a 4.2 para alguma versão superior, e o website simplesmente pára de funcionar pelo faro das variáveis não existirem.

    Muito provavelmente a partir do PHP versão 6 essa diretriz será completamente eliminada.

    Para resolver esse problema é necessário analisar os logs gerados pelo PHP e registrar as variaveis segundo os exemplos que serão vistos adiante.

    A seguir temos um exemplo de um código-fonte que poderia ser maliciosamente explorado se register_globals estiver habilitado:

    <?php

    }

    }

    ?>

    if (authenticated_user()) {

    $authorized = true;

    if ($authorized) {

    include “/highly/sensitive/data.php”;

    Obviamente o grande problema do script anterior está no fato de ser um código pouco inteligente, mas suponha que na URL o usuário faça uma chamada como a mostrada a seguir, teríamos então a validação do segundo if.

    http://www.exemplo?authorized=true

    Alterando poucas coisas no script é possível corrigir esse problema. Poderíamos, por exemplo, fazer o seguinte:

    <?php

    }

    }

    ?>

    Sauthorized = false, if (authenticated_user())

    $authorized = true;

    if (Sauthorized) {

    include “/highly/sensitive/data.php”;

    Tenha em mente que registrando a variável, a segurança do código certamente foi melhorada, mas qualquer deslize por parte do programador pode ser fatal.

    Uma vez que register_globals = 0ff é obrigatório registrar as variáveis, uma a uma, e isso é muito bom, pois dessa forma será possível ter o controle de todas as variáveis envolvidas na execução do script.

    Adicionalmente ao registro de uma variável, é de suma importância verificar o tipo dela e também aplicar um filtro, para que só então ela seja trabalhada no corpo do programa.

    A partir do PHP versão 4.1.0 foram introduzidas as superglobals $_GET, $_POST,$_COOKIE e ~FILES, que têm a finalidade de importar dados provenientes dos métodos GET, POST, COOKIE e de upload de arquivos respectivamente. Esses arrays estão sempre carregados, e podemos obter valores deles sempre que for necessário.

    Como já estamos convencidos de que manter essa diretriz ativa não é uma boa idéia, os demais exemplos levarão em consideração que register_globals = 0ff

    VN:F [1.3.1_645]
    Rating: 4.5/10 (4 votes cast)
    • Share/Save/Bookmark
  • O arquivo PHP.INI

    Posted on February 20th, 2009 Sites No comments

    A configuração do PHP é feita no arquivo /etc/php. ini. Dependendo da distribuição Linux, esse arquivo pode ser encontrado em outro caminho, como no /usr/local/etc e até mesmo em /etc/apache.

    Existem grandes diferenças entre a configuração do PHP em um ambiente de desenvolvimento e em um ambiente de produção - o ambiente de desenvolvimento deve proporcionar uma grande quantidade de informações para que o programa possa ser escrito da melhor forma possível, e o ambiente de produção deve oferecer apenas as informações necessárias para os usuários usufruirem da aplicação com o melhor desempenho possível e com a segurança esperada.

    É importante ressaltar que, após eventuais alterações em qualquer uma dessas diretrizes, o servidor web precisará ser reiniciado para que as alterações entrem em vigor.

    VN:F [1.3.1_645]
    Rating: 0.0/10 (0 votes cast)
    • Share/Save/Bookmark
  • Configuração do PHP: Padrão

    Posted on February 20th, 2009 Sites No comments

    É no arquivo de configuração php.ini as configurações que se referem ao comportamento futuro do Servidor PHP são realizadas. Este arquivo controla como o Servidor PHP irá se comportar e é importantíssimo saber como configura-lo corretamente.

    A maioria da configurações usadas podem ser aplicadas no padrão sem problemas, mas dependendo das necessidades de seu projeto (ou dos sites de seu Servidor de Hospedagem de Sites) é necessária uma revisão.

    Comando: short open tag

    Sintaxe: short _ open _ tag

    Utilização: indica se existe permissão para o uso da forma curta (<? ?>) da etiqueta de abertura do PHP. Se você deseja utilizar o PHP em conjunto com o XML, pode desabilitar essa opção para usar diretamente <?xml ?>. Também é possível imprimir essa seqüencia com PHP, como visto no exemplo seguinte. Se o parâmetro está desabilitado, deve-se usar a forma estendida da etiqueta de abertura (<?php ?>).

    Essa diretiva afeta, também, a contração <?=, idêntica à <? echo. O uso desse atalho requer que short _ open _ tag encontre-se habilitado.

    Variáveis: boolean TRUE (habilita a função)/FALSE (desabilita a função).

    Exemplo:

    <?php echo `<?xml version=~1.0″‘; ?>

    Comando: precision

    Sintaxe: precision integer

    Utilização: define o número de dígitos significativos utilizados em números de ponto flutuante.

    Variáveis: valor de integer.

    Exemplo:

    precision 1234

    Comando: allow call time pass reference.

    Sintaxe: allow call time país referende boolean.

    Utilização: indica se deve ser emitida uma advertência quando são passados argumentos por referência no momento de efetuar chamados de função. Esse método é considerado obsoleto e é possivel que não seja suportado em versões futuras de PHP. É recomendável que essa opção seja desabilitada, além de assegurar que seus scripts trabalhem corretamente sem ela.

    Variáveis: boolean ON (habilita a função)/OFF.

    Não há exemplos pertinentes.

    VN:F [1.3.1_645]
    Rating: 8.5/10 (2 votes cast)
    • Share/Save/Bookmark