2010-05-29 23 views
5

Estoy trabajando en un viejo libro php mysql escrito en 2003. El autor usa la función include() para construir páginas html al incluir header.inc, footer.inc, archivos main.inc, etc. Ahora descubro que esto no está permitido en la configuración ini predeterminada, (allow_url_include está desactivado) después de recibir muchas advertencias del servidor.include() ¿Por qué no debería usarlo?

Me di cuenta también de que puede usar incluir sin los paréntesis. Intenté esto y funciona y no recibo mensajes de error o advertencias. Son los dos diferentes? Es decir, ¿incluye() diferente de incluye?

+0

¿Es esto realmente una pregunta de seguridad? – rook

+0

debe usarlo ... – Artefacto

Respuesta

4

El uso de include() puede introducir un Local File Include (LFI) o Remote File Include(RFI) Vulnerably. Debería tratar de evitar el uso de include, por ejemplo si incluye HTML es mejor escribir print(file_get_contents($file)) que include($file). Sin embargo, include() 'ing PHP files es necesario en la mayoría de las aplicaciones de php para reducir la duplicación de código.

Incluso cuando la inclusión de archivos remotos está deshabilitada todavía es posible explotar el sistema usando un Advanced LFI Attack.

Si es necesario aceptar la entrada del usuario en un include(), entonces usted debe asegurarse de que está en una lista blanca:

$good_includes=array("contact","home","view"); 
if(in_array($_GET[page],$good_includes)){ 
    include("inc/".$_GET[page].".php"); 
} 
+0

¿Por qué se votó a favor? Puede ser relevante para los ejemplos del libro de preguntas. Y es interesante de todos modos. – mario

+0

print (file_get_contents ($ file)) que include ($ file) no son exactamente intercambiables y los enlaces incluidos se refieren al uso de datos no validados en las instrucciones include, lo cual es estúpido y tiene potencial de daño tanto para file_get_contents como para include. Downvoted. – Artefacto

+0

@Artefacto ** ... si incluye HTML ... ** – rook

16

Esto es un malentendido. Puede desactivar la inclusión de los archivos remotos (utilizando una URL http://www.example.com/include.php en lugar de una ruta del sistema de archivos). Siempre puede incluir archivos locales.

Esto último es porque include no es una función normal, sino una construcción de lenguaje. Al igual que die, se puede usar con o sin paréntesis. Fuente: Manual

Porque include() es una construcción de lenguaje especial, no se necesitan paréntesis alrededor de su argumento. Tenga cuidado al comparar el valor de retorno.

+0

¿Cómo es esta una respuesta de seguridad? (Esta pregunta tiene una etiqueta de seguridad ...) – rook

+0

@ The Rook No veo ninguna indicación de que el OP esté preguntando sobre el uso de variables para incluir nombres. Creo que la etiqueta 'security' se agregó debido al aspecto' allow_url_include'. –

+0

¿Hay momentos específicos cuando utiliza los paréntesis y otros cuando no? ¿Existe una práctica estándar de usarlos o no? ¿Hay alguna razón por la cual no sean necesarios? ¿Es para diferenciarlos de otras funciones que no son estructuras de control? – aliov

-1

Hay una diferencia importante con include/require_once y require.

La principal diferencia es el informe de errores, si utiliza incluir en su aplicación, PHP intentará cargar el archivo, pero si no existe, arrojará un error no fatal (lo que significa que el script no se detendrá), si están usando require, entonces el script se detendrá y detendrá el procesamiento.

Utilice require en los archivos que son fundamentales para su aplicación y use include en sus plantillas porque si hay un error puede especificar que no se muestre el error y así el usuario no notará la diferencia siempre y cuando no sea primario plantilla incluye como header.php

estas funciones se utilizan principalmente en su propio servidor para incluir archivos que son relevantes para su aplicación.

si incluye archivos fuera de su servidor, entonces usaría curl si está instalado o file_get_contents().

Espero que esto te ayude.

sólo una nota en require vs require_once, require_once añadirá lógica para asegurarse de que el archivo no se incluye más de una vez, es decir, que no desea declarar su conexión a la base de datos más de una vez

+0

No trata la emisión real =/ – Matchu

+0

downvote por ser completamente lateral a la pregunta. – Artefacto

0

Función include es bueno para inquisición dinámica de archivos. Si incluimos archivos en ciclo, esto es muy bueno. Pero si incluimos archivos estáticos, deberíamos usar require. Segunda función en el comienzo de la secuencia de comandos.

Cuestiones relacionadas