Es facil... solo debes hacer un array con todas las posibles rutas y luego hacer la comparación con tu parámetro get, si existe la incluyes y si no existe das un 404, de esa manera te aseguras que solamente las rutas reales van a ser solicitadas y nada de cosas extrañas con rutas extrañas.
Por ejemplo:
<?php
if(in_array('includes/'.(string
)$_GET['sección'].'.php', glob('includes/*.php'))) include('includes/'.(string)$_GET['sección'].'.php');
else
include('includes/404.php');
El cast (string) es para que no te de una excepción si te pasan arrays como parámetros.
También puedes aceptar directorios como lo hace wordpress cuando puedes poner un plugin como plugin.php o una carpeta llamada plugin y un index:
<?php
/* Es archivo */
if(in_array('includes/'.$_GET['sección'].'.php', glob('includes/*.php'))) include('includes/'.$_GET['sección'].'.php');
/* Es directorio */
elseif(in_array('includes/'.$_GET['sección'].'/index.php', glob('includes/*/index.php'))) include('includes/'.$_GET['sección'].'/index.php');
/* No existe */
else
include('includes/404.php');
Ahora, si usas file_exists() o is_dir() tendrás que tener cuidado con los agujeros de tipo LFI o RFI, usar esas fuinciones para incluir archivos es muy mala práctica.
Según el blog de donde das en enlace (
http://www.jemjabella.co.uk/2006/safe-dynamic-includes/ ) dice que se debe hacer así:
if (strpos($_GET['x'], "/")) {
Es una malisima práctica, muchos sistemas han sido programados de esa manera y estan llenos de agujeros de seguridad como unos mods y plugins para phpnuke, joomla y wordpress, por ejemplo esto sería vulnerable en base a ese código:
index.php?x=.htpasswd
a demás strpos() solo te indica la primera coincidencia, o sea que yo podría escribir algo//algo y bypasear el filtro, insertar carácteres nulos para cortar el include con un %00, etc etc.