texto - propiedades de un archivo php
Sanitize la ruta del archivo en PHP (7)
Aquí hay un riesgo de seguridad adicional y significativo. Esta secuencia de comandos inyectará la fuente de un archivo en la secuencia de salida sin ningún procesamiento del lado del servidor. Esto significa que todo su código fuente de cualquier archivo accesible se filtrará a internet.
Saludos, espero asegurar mi pequeño programa para que los posibles usuarios malintencionados no puedan ver los archivos confidenciales en el servidor.
$path = "/home/gsmcms/public_html/central/app/webroot/{$_GET[''file'']}";
if(file_exists($path)) {
echo file_get_contents($path);
} else {
header(''HTTP/1.1 404 Not Found'');
}
Por la parte superior de mi cabeza sé que la entrada como ''../../../../../../etc/passwd'' sería un problema, pero me pregunto qué otras entradas maliciosas debería esperar y cómo para prevenirlos
Incluso si usa realpath, aún debe quitar todo ".." antes de usarlo. De lo contrario, un atacante puede leer la estructura de directorios completa de los servidores con fuerza bruta, por ejemplo, "carpeta_válida /../../ test_if_this_folder_name_exists / valid_folder". Si la aplicación acepta esta ruta, el atacante sabe que la carpeta existe.
Para quitar todo /. /..
/. /..
o /. / .. y convertir a toda la barra inclinada porque los diferentes entornos aceptarán barras diagonales. Esto debería proporcionar un filtro bastante seguro para la entrada de ruta. En su código, debería compararlo con los directorios principales a los que no quiere acceder por las dudas.
$path = realpath(implode(''/'', array_map(function($value) {return trim($value, ''.'');}, explode(''/'', str_replace(''//', ''/'', $path)))));
Si puede, use una lista blanca como una matriz de archivos permitidos y verifique la entrada con eso: si el archivo solicitado por el usuario no está en esa lista, rechace la solicitud.
Solución por OP:
$baseDir = "/home/gsmcms/public_html/central/app/webroot/";
$path = realpath($baseDir . $_GET[''file'']);
// if baseDir isn''t at the front 0==strpos, most likely hacking attempt
if(strpos($path, $baseDir) !== 0 || strpos($path, $baseDir) === false) {
die(''Invalid Path'');
} elseif(file_exists($path)) {
echo file_get_contents($path);
} else {
header(''HTTP/1.1 404 Not Found'');
echo "The requested file could not be found";
}
Utilice el basename lugar de tratar de anticipar todas las rutas inseguras que un usuario podría proporcionar.
realpath() le permitirá convertir cualquier ruta que pueda contener información relativa en una ruta absoluta ... luego puede asegurarse de que la ruta se encuentre dentro de un determinado subdirectorio desde el que desee permitir descargas.