La mitigación presentada es absolutamente insuficiente. No solo es posible incluir ningún archivo del directorio actual sino también de cualquier directorio dependiendo del sistema de archivos (es decir, \..
todavía funciona en Windows) o usando una ruta absoluta (por ejemplo, /…
en sistemas similares a Unix) , o \…
en Windows) también a través de diferentes protocolos / envoltorios (por ejemplo, http://…
, file://…
, ftp://…
, etc.), permitiendo la ejecución de código PHP arbitrario.
Si no quieres esto, debes validar el valor del parámetro. Por ejemplo, si solo desea permitir ciertos valores, use una matriz y verifique si el valor dado está en ella:
$validValues = array();
if (!in_array($page, $validValues, true)) {
die("invalid 'page' value");
}
Si desea permitir cualquier archivo dentro de un determinado directorio, puede verificar si la ruta absoluta resultante aún apunta a un archivo dentro de ese directorio usando la técnica descrita en Impedir el cruce de directorios en PHP pero permitiendo rutas .