Inclusiones dinámicas con PHP
He aquí otro modo de realizar inclusiones gracias a PHP cuando tenemos un sitio con mucho contenido o muchas secciones, pues utilizar en estos casos el método que ya hemos explicado puede llegar a ser contraproducente.
Es posible que ya sepamos cómo hacer la tarea de construcción y administración de sitios más fácil gracias al tutorial “Inclusiones con PHP”, que además nos permite obtener URLs del tipo index.php?algo.
Pero cuando tenemos un sitio con mucho contenido o muchas secciones, quizás nos venga mejor el método que explicamos ahora, con el que cada sección del sitio está en un archivo diferente, y todos esos archivos de contenido se encuentran en una carpeta.
Si no estamos familiarizados con cómo incluir archivos en una página utilizando la función PHP include(), es bueno haber leído el tutorial “Inclusiones con PHP” para hacerse una idea.
Comencemos:
Primero, creamos en el directorio o carpeta donde guardamos nuestro sitio un nuevo directorio y lo llamamos “pags” (de “páginas”), o cualquier otro nombre que nos permita identificar dónde están los contenidos, pero eso sí: sin tildes o caracteres especiales. En este nuevo directorio pondremos todos los archivos que queremos incluir. Eso sí, los archivos deben tener la extensión .php.
Luego, decidiremos cuál de nuestros archivos de contenido será el que aparezca por defecto cuando los visitantes accedan a nuestro sitio. Podemos identificarlo con un nombre como “principal.php”, “hola.php” o algo por el estilo.
Conviene advertir que en estos archivos de contenido tendremos el código HTML de lo que se quiere incluir. Las partes que se repiten en todas las páginas (la cabecera y el pie) deben estar en archivos separados y también los incluiremos al principio y al final de cualquier página utilizando la función PHP include.
Ahora construiremos el archivo index.php al que apuntarán los navegadores cada vez que los visitantes accedan a nuestro sitio. Ese archivo debe hallarse en el directorio general: el inmediatamente superior a la carpeta “pags”. En este archivo index.php se encontrará todo el código PHP que necesitamos. No tenemos más que copiar y pegar el código siguiente:
index.php
<?php $pag = basename($_SERVER['QUERY_STRING']); include('cabecera.inc'); if(!$pag){ include('pags/principal.php'); } else { if(file_exists('pags/'.$pag.'.php')){ include('pags/'.$pag.'.php'); } else { echo('¡Esa página no existe!'); } } include('pie.inc'); ?>
Si nuestros archivos de cabecera, pie y bienvenida tienen nombres diferentes a “cabecera.inc” o “pie.inc”, debemos cambiarlos en el código.
Para finalizar, si no hemos realizado estas tareas desde el servidor, subimos la carpeta “pags” y el archivo index.php, junto con los demás archivos necesarios para el sitio y ya está.
A la hora de abrir cada una de las secciones, que en principio se corresponden con los archivos que queremos incluir, lo haremos del modo siguiente.
Por ejemplo, para abrir el archivo “perlas.php” que se encuentra en pags/perlas.php, el enlace será “index.php?perlas”; se nos mostrará entonces la página completa en la que el contenido hablará sobre perlas. En lugar de poner la nota “¡Esa página no existe!”, podemos incluir un archivo de error 404 personalizado para aquellos casos en los que un visitante intente acceder a archivos que no están en nuestro servidor.
Este código es seguro (al menos aún no se han tenido noticias de que no lo sea): no se podrá incluir nada que no que no esté en el directorio “pags” o que no sean los archivos de cabecera o pie.
Excelente artículo. Yo algo sabía pero queda más claro con esta explicación.
Gracias.
Y si, es que hay una tecnica defacing muy famosa y la mas utilizada RFI(remote file inclusion), donde se pueden incluir ficheros externos en el sitio por urls del tipo index.php?page=noticias.php
si cambiamos noticias.php por http://misite.com/a.txt
donde a.txt tiene funciones como “sytem()” o “showsource()” pondria en peligro no solo el sitio, si no el servidor completo
Bien explicado. Sin embargo, si queremos que sea totalmente seguro, tendríamos que hacer que no se puedan acceder directamente a los archivos del directorio pags y así asgurarnos de que se incluyan siempre la cabecera y el pie.
Para hacer esto, yo crearía un archivo index.php en el directorio pags y le incluiría dentro el siguiente código:
Luego, para asegurarte de que no puedes hacer http://www.mipagina.com/pags/noticias.php deberías incluír al principio de todos los archivos php del directorio pags, excepto el index.php que hemos creado anteriormente, el siguiente código:
Lo he escrito rápido así que quizá haya algún fallo sintáctico o algo, pero básicamente se entiende la idea.
Obviamente, debe ir SIEMPRE el primero, antes que cualquier otra cosa.
Y recuerdo que todo lo que he dicho se hace siempre sobre los archivos del directorio pags, que es donde queremos evitar que se acceda directamente.
Ahí debería haber un código. No sé qué pensar de una página llamada “maestrosdelweb” y donde no se controlan cosas tan básicas como la traducción de códigos HTML o códigos PHP. Hay una función que se llama htmlentities que lo hace solo. Pero bueno, ustedes sabrán lo que hacen con su página.
El primer código es:
header(“Location: ../index.php”);
Y el segundo es:
$archivo=basename($_SERVER[“PHP_SELF”]);
if ($archivo!=”index.php”)
{
header(“Location: ../index.php?”.substr(0,strlen($archivo)-4));
exit;
}
Michoacano, en principio, con este método no se podría acceder a nada que no estuviese en el directorio “págs”.
Angro, no podemos ver tu código, pero sería muy interesante. Si lo envías a la redacción de Maestros del Web, podríamos publicarlo. De todos modos, yo siempre recomiendo que nunca tengamos cosas supersecretas en el código que vayamos a incluir.
Calitoe: lo sé, solo quería recalcar eso
Muy bueno es lo que buscaba le doy gracias a la persona que haya hecho este pequeño tutorial.
La manera en que yo suelo hacer los includes es la siguiente:
· Hago una página llamada “secciones” donde mando siempre una variable sec=’1′ o por ejemplo ‘noticias’ luego en la propia pagina “secciones” escribo
$sec=$_GET[‘sec’];
y luego hago un switch ($sec) {
case ‘1’:
include (‘noticias.php’);
break;
case ‘cultura’:
include (‘cultura.php’);
break;
default:
echo “location.href=\”shop.php\””;
break;
}
asi en los archivos “incluidos” solo va codigo limpio php o mezclado pero que es facilmente manipulado… A algunos les parecerá dificil o raro, pero a mi me funciona super.
Saludos desde Argentina
hay una cosa que me tiene inquieto. Algunas paginas de hoteles que al buscar un hotel sale el nombre del hotel en la pagina.como si se crearan dinamicamente al buscarla.no creo que lo hayan hecho a pelo como se dice. si alguien pudiera darme alguna pista lo agradeceria.un ejemplo de la pagina: quehoteles.com. un saludo
‘pie.inc’ por que en un anterior articulo dicen que no es seguro esa extension .inc???
Sinceramente, no lo tengo claro. Yo creo que no es que no sea segura, es que si se accede a ese archivo .inc directamente, se ve el código, así que si tienes algo comprometedor en cualquier sentido de la palabra en ese código, pueden aprovechar para atacarte de algún modo. A mí no me importa que se vea el xhtml o cómo acceder a la hoja de estilos de mi página o un par de javascripts, por eso sigo usando la extensión .inc y nunca he tenido problemas. Si aún no las tienes todas contigo, utiliza también en las inclusiones la extensión .php, también funciona, aunque si quieren ver el código, tampoco es muy difícil que digamos conseguirlo con ese método…
Gomas?
Gracias angro. Utilicé el código para proteger mis archivos y quedó perfecto. Un saludo, JD
este codigo php
no es muy seguro
no recomiendo usarlo pueden hacer un remote file inclucion.
y hackear la pagina.
Nuevo local de escorts en Barcelona. EasySex, las mejores escorts con unas instalaciones inmejorables…
me podras enviar codigo donde pueda hacer mi relacion de actividades ejemplo en mi tabla esta NOMBRE DE ACTIVIDAD, DIA DE ACTIVIDAD, FOTO DE ACTIVIDAD,LUGAR DE ACTIVIDAD Y SU PAIS Q LO REALIZA
yo quiero q la imagen me pinte en php con sus demas detalles
espero q lo puedas hacer. bueno lo espero en 2 dias claro si lo puedes si no te enviare ese codigo de lo que yo queria…Gracias
Hola a todos, muchas gracias por explicar esto, me ha servido de mucho, en mi caso por el momento lo tengo asi:
http://www.miweb.com/index.php?rock (para la pagina donde esta el reproductor con ese genero)
pero lo que queria saber es de que manera puedo hacer que el link sea:
http://www.miweb.com/index.php?id=rock
o bien:
http://www.miweb.com/index.php?radio=rock
Espero que me puedan ayudar, dese ya muchisimas gracias!
saludos!