ASP Fcil
El sitio para programadores ASP  

Búsqueda rápida
Ayuda
Secciones
Portada
Diario
Artículos
Código
Trucos
Foros ASP
Recursos
Favoritos
Referencia
Tutorial SQL
SQL-O-Matic
Otras
Boletín ASPFácil
Colabora
Sobre este sitio
Anunciarse aquí
Cont@ctar
Formación


Versión para imprimir / Salvar en Favoritos

Todo sobre los #includes

por MOS

Qué son los #includes, para qué se utilizan, seguridad e #includes... ¿Es posible hacer #includes dinámicos? En este artículo se explica todo lo que hay que saber sobre las inclusiones de servidor, y algo más.

Introducción

Los #includes, server side includes (SSI) o en español, inclusiones de servidor, te permiten copiar el contenido de un fichero en otro fichero. La ventaja de las inclusiones es que te permite agrupar código en ficheros, y utilizarlo en todas las páginas que quieras. Por ejemplo, se pueden agrupar todas las funciones sobre fechas, incluir el fichero y utilizarlo en cuantas páginas necesites, así:

fechas.asp

<%

Function Mes ( m )
' Recibe un número correspondiente a un mes
' e imprime su nombre en español.
select case m
	case 1
		Mes = "Enero"
	case 2
		Mes = "Febrero"
...
end select

%>

Y en cualquier otra página ASP:

<!--#include file="fechas.asp"-->
<%

Response.Write( Mes (2) )

...

%>


Fíjate que en nuestro archivo a incluir fechas.asp, el código ASP va entre delimitadores (<%, &>). Puesto que incluir un fichero es como copiar y pegar su contenido, si éste es código, tendrá que ir delimitado ya que el #include se encuentra fuera del código ASP.

Otro uso muy extendido de las inclusiones es, incluir HTML. Es decir, guardamos por ejemplo toda la cabecera de una página con los colores, el logotipo, etc... y lo traemos a nuestra página con un #include.

La sintaxis para hacer un include es la siguiente:

<!-- #include file="xxxxxx" -->

o bien:

<!-- #include virtual="xxxxxx" -->

La palabra clave file indica que se va a incluir un fichero que está en el mismo directorio que la página que ejecuta el #include. Y, aunque la Documentación de NCSA sobre HTTPd especifica que las inclusiones de servidor no pueden contener "../", las inclusiones con ASP sí pueden. Es decir, que podemos incluir con #include file un fichero del directorio inmediatamente anterior al actual, por ejemplo, con: #include file="../xxxxx".

La consecuencia de esta libertad que se ha tomado Microsoft, es que puedes incluir ficheros que estén fuera del sitio web en el servidor, a base de encadenar ../. Para hacer esto, de todas formas, el IIS debe estar configurado adecuadamente.

La palabra clave virtual, en cambio, indica que la ruta que viene a continuación es una ruta virtual. Esto es, contiene directorios virtuales, no reales. Así:

<!-- #include virtual="/xxxxx" --> incluiría un archivo que se encuentra en el directorio raíz de publicación web del servidor, mientras que

<!-- #include virtaul="/includes/xxxxxx" --> incluiría un archivo que se encuentra en el directorio virtual includes/.

(Un directorio virtual, es un alias que utiliza el servidor web para acceder a un directorio físico.)

¿Qué tipo de ficheros puedo incluir, y qué ficheros pueden utilizar inclusiones?

El título de este apartado es así de enrevesado adrede... Veamos alguna de las características más desconocidas de los #includes.

  1. Un archivo #include puede incluir a su a otros archivos. Podríamos, pues, incluir el archivo uno.asp, que éste incluyera a dos.asp, y éste a tres.asp, cuatro.asp y cinco.asp. Efectivamente, te puedes armar un lío padre con esto... :)
  2. La única limitación para el punto anterior es que no puedes incluir un archivo que a su vez incluya al primero. Es decir, no se pueden hacer #includes circulares. Ya era demasiado... :)
  3. A través del administrador del Internet Information Server, puedes añadir un nuevo tipo de archivo MIME para cualquier extensión. Podemos hacer, por tanto, añadiendo el tipo MIME text/html, que nuestras páginas web sean default.mos. Aunque sólo sea para fanfarronear... Además, también puedes configurar el Sitio Web para que estas páginas las procese ssinc.dll, de tal forma ¡que puedan incluso utilizar #includes! (Propiedades del Sitio Web, Configuración, Mapeado de Aplicaciones, Añadir).

¿Puedo hacer #includes dinámicos?

Lamentablemente, el orden en que el servidor web va procesando las páginas antes de enviarlas al cliente, no permite hacer algo como:


<!--#include file="inc<%=Request.Form("Numero")%>"-->

debido a que cuando el servidor va a enviar un archivo que está asociado a ssinc.dll, esta DLL lo procesa antes de que lo procese asp.dll, por lo que no entiende nada de <% ... %>, y dará un error de "Archivo include no encontrado".

¿Soluciones? Si el archivo que intentas incluir dinámicamente contiene sólo código ASP, y el archivo a incluir depende del valor de una variable, podrías hacer algo como:


select case iEleccion

	 case 1:
%>
	<!--#include file="1.asp"-->
<%case 2:%>
	<!--#include file="2.asp"-->
<%
end select
%>

Aunque los 3 archivos serían incluidos, sólo el código del que eligiese nuestra sentencia select sería ejecutado, porque el código estaría dentro de ese case.

¿Y si quiero incluir HTML dinámicamente? Por ejemplo, supongamos que tenemos un sitio web donde permitimos a los visitantes elegir el color de fondo y el aspecto, y guardamos sus preferencias mediante una cookie. Tendríamos que leer el contenido de esa cookie cuando el visitante volviese, y elegir en consecuencia el archivo a incluir. El método anterior no funciona, puesto que el HTML, cuando sea traído a nuestra página tras resolverse el #include, aparecería instantáneamente en el navegador.

Por fortuna, hay una solución bastante extendida, que consiste en utilizar el objeto FileSystemObject para leer el contenido del archivo que queremos incluir, y mostrarlo en el navegador con un Response.Write.

Aquí tenéis el código que implementaría esto:

Function IncluirHTML(archivo)
  Dim objFSO
  Dim objText
  Dim strPage


  'Instanciamos el objeto FSO
  Set objFSO = Server.CreateObject("Scripting.FileSystemObject")


  'Abrimos el archivo pasado como argumento
  'Utilizamos "MapPath" para hallar la ruta física al archivo.

  Set objText = objFSO.OpenTextFile(Server.MapPath(archivo))


  'Leemos el contenido y lo devolvemos como una cadena de texto
  IncluirHTML = objText.ReadAll

  objText.Close
  Set objText = Nothing
  Set objFSO = Nothing
End Function

La forma de utilizar esta función sería:

Dim aspecto

aspecto = Response.Cookies("aspecto")

'Imprimimos el HTML que el usuario decidió
Response.Write(IncluirHTML(aspecto))

Así, nuestra página que guarda las preferencias de los visitantes, guardaría una cookie con el nombre del fichero a incluir. Después, recuperamos ese valor, y utilizamos IncluirHTML para cargar en el navegador el contenido correspondiente.

Podríamos almacener otro valor en la cookie, por supuesto, y elegir después el fichero en función del valor. Hay que resaltar que el argumento que recibe la función es el mismo que se pasa a Server.MapPath, por lo que si el fichero está en otro directorio, hay que llamar a la función con la ruta. (IncluirHTML("/includes/rojo.htm"))

Seguridad e #includes

Para terminar nuestro repaso a las inclusiones, un par de aspectos sobre la seguridad de nuestro website al utilizarlas.

Microsoft recomienda utilizar convenciones de nombres, y en este caso recomienda utilizar la extensión .inc para los archivos que incluyamos. Sin embargo, hay un problema: si alguien averigüase el nombre de nuestro fichero, podría escribirlo en la barra de direcciones y descargarlo enterito. Esto es muy peligroso, puesto que podrían ver nuestras conexiones a base de datos, y muchos más datos que sólo importan al servidor.

¿Y cómo van a adivinar el nombre? En teoría no pueden, pero imagina que se nos cuela un error en nuestro archivo a incluir, por ejemplo un error ortográfico. El explorador dirá:

"Error x8x8x8x8x8x87x".

/archivo.inc, línea 40.

Ahí tienen perfectamente legible el nombre de nuestro archivo. Incluso si esa página no está referenciada aún por ninguna de las páginas de nuestro site, un motor de búsqueda potente podría indexarla, y haciendo una búsqueda maliciosa podrían encontrarla. Para ver cómo sería esto posible, visita este artículo de 4GuysFromRolla.

¿Qué hacer para evitarlo? Muy sencillo, utiliza la extensión .asp para las inclusiones peligrosas. Así, aún si alguien supiese el nombre del archivo, al pedirlo el servidor preprocesaría el ASP y el cliente avieso no vería nada de nada. :-)

Y creo que con esto termino, y no me dejo nada...

Un saludo,
MOS

>> ¿Quieres saber cuándo se publicarán nuevos artículos? ¡Suscríbete al Boletín de ASPFácil! << 
>> Comparte tus dudas y comentarios sobre este artículo en el foro Artículos de ASPFácil << 
(Arriba)

© ASP Fácil 2000-2004 excepto en casos indicados
El mejor alojamiento web en acens