Hola,
Solucion 1: si conoces la lista de ficheros que vienen en ese parametro, pon esa lista en un array, compruebas si el parametro esta en el array, y si no esta le mandas una sorpresa:
Código PHP:
$ficheros=array("doc1.html","doc2.dat");
if (!in_array($_GET['file'],$ficheros)) {
echo "INTRUSO, INTRUSO! Mandando bomba digital ;=)";
exit;
}
Quien dice un array, dice una base de datos. Y quien dice que el parametro es el nombre del fichero, dice que es la clave de un indice de un array asociativo.
Solucion 2: si el parametro puede ser un nombre de fichero, y no puede ser una ruta, lo que puedes hacer es coger solo el nombre del fichero del parametro. Mira la funcion basename() (
www.php.net/basename).
Solucion 3: si en el parametro puede venir nombre y ruta, tendrias que asegurarte que la ruta apunta a un directorio permitido. Para hallar el verdadero path, puedes usar la funcion realpath() (
www.php.net/realpath). Eso resolvera todos los .. del parametro. Solo tendrias que comprobar que el resultado esta dentro de tus directorios permitidos.
Saludos.