Cita:
Iniciado por winjose Hola amigos, pues estoy haciendo una web modular, y bueno he googleado y he visto varios metodos como por ejemplo, utilizando switch, o mediante la utilizacion de includes. Mi sistema es el siguiente:
Código PHP:
<?php
/*
Mi web modular.
*/
//Configuración...
$carpeta = 'secciones/'; //Carpeta que contiene las secciones de nuestra web.
//Obtenemos la sección que el usuario está solicitando
$seccion = @$_GET['sec'];
//Si el usuario no ha solicitado ninguna sección en especial, eso significa que quiere ver la página principal de nuestra web, que será "home", así que le damos ese valor a la variable.
if (empty($seccion)){
$seccion = 'home';
}
//Acto seguido verificaremos que el archivo de sección que el usuario está solicitando exista en la carpeta que hemos definido en la variable $carpeta. Si éste existe, "incluimos" el contenido. De lo contrario, indicaremos que la sección no existe.
if (file_exists($carpeta . $seccion . '.php')){
include($carpeta . $seccion . '.php');
}else{
echo '¡La sección no existe! Por favor <a href="' . $_SERVER['PHP_SELF'] . '?sec=home">vuelva a la página principal.';
}
?>
</div>
</body>
</html>
Y ahora bien; ¿Es un sistema fragil? me refiero a seguridad. ¿Me lo recomiendan, o quizás debiera utilizar otros metodos?
Gracias desde ya!! y un SALUDO!!
Disculpen si estoy reviviendo viejos temas, pero como he usado tu codigo me senti en deuda asi que te dejo un grave error que encontre y su solucion.
El error permite la ejecucion de codigo remoto e incluso dejar muerto el server en un loop infinito.
El problema reside en que no estas manejando la variable $sec para que no reciba slashes "/" por lo que puedes saltar de carpeta en carpeta por el servidor como quieras.
Como ejemplo tenemos la siguiente estructura de archivos
/
-Secciones
--seccion1.php
--seccion2.php
-index.php
-archivo_malicioso.php
Dado que como directorio inicial es sistema usaria "Secciones" solo deberiamos retroceder un nivel para enlazar a "archivo_malicioso.php". En el funcionamiento normal tendremos urls del tipo:
www.direccion.algo/index.php?sec=seccion1
Pero se usamos la direccion
www.direccio.algo/index.php?sec=../archivo_malicioso
Ejecutariamos el archivo maldito. Tambien si en vez de usar la url anterior usamos esta:
www.direccio.algo/index.php?sec=../index
El sistema caeria en un bucle sin fin ya que cada vez que llama a index este a su vez llama de nuevo a index y asi sucesivamente.
La solucion es tan simple como usar la funcion explode (provisorio ya que no se si sirve contra urls codificadas). La funcion la usariamos de la siguiente forma:
Código PHP:
<?php
$antipath=explode ("/",$seccion);
$seccion=$antipath[0];
//echo $seccion; //Una pequeña comprobacion en tiempo de programacion para ver si realmente funciona.
?>
Quedando como codigo final:
Código PHP:
<?php
//Configuración...
$carpeta = 'Secciones/'; //Carpeta que contiene las secciones de nuestra web.
//Obtenemos la sección que el usuario está solicitando
$seccion = @$_GET['sec'];
//Si el usuario no ha solicitado ninguna sección en especial, eso significa que quiere ver la página principal de nuestra web, que será "home", así que le damos ese valor a la variable.
if (empty($seccion)){
$seccion = 'Inicio';
}
//Acto seguido verificaremos que el archivo de sección que el usuario está solicitando exista en la carpeta que hemos definido en la variable $carpeta. Si éste existe, "incluimos" el contenido. De lo contrario, indicaremos que la sección no existe. Y tambien una pequeña validacion para evitar ejecuciones no autorizadas.
$antipath=explode ("/",$seccion);
$seccion=$antipath[0];
//echo $seccion; //Una pequeña comprobacion en tiempo de programacion para ver si realmente funciona.
if (file_exists($carpeta . $seccion . '.php')){
include($carpeta . $seccion . '.php');
}
else{
echo '¡La sección no existe! Por favor <a href="' . $_SERVER['PHP_SELF'] . '?sec=Inicio">vuelva a la página principal.';
}
?>
Con esto cualquier intento de usar / queda invalidado y mandaria el mensaje que no existe la seccion. Tambien se pueden agregar mas filtros, para eso se puede consultar la ayuda del comando explode.