varios todos para otro mover manipulación manejo los informatica ejemplos directorios directorio crear comandos comando archivos archivo php security sanitization

php - para - mover todos los archivos de un directorio a otro en linux



¿Cómo me aseguro de que una ruta de archivo esté dentro de un subdirectorio dado? (3)

Llamada

$path = realpath("sample/$path");

Luego verifique que la ruta resultante comience con el directorio que está esperando.

Quiero asegurarme de que la ruta del archivo establecida a través de la cadena de consulta no salga del subdirectorio deseado. En este momento, estoy comprobando que:

  1. La ruta no comienza con " / ", para evitar que el usuario proporcione una ruta absoluta.
  2. La ruta no contiene " .. " para evitar que el usuario proporcione una ruta que esté fuera del subdirectorio deseado.
  3. La ruta no contiene " : ", para evitar el uso de una url (es decir, " http:// ", " ftp:// ", etc.). Si alguna vez ejecuto este script en un servidor de Windows (no es probable), esto también evitará que las rutas absolutas comiencen con un especificador de unidad (es decir, " C:/ "). Nota: Soy consciente de que un signo de dos puntos es válido en los nombres de archivo de Unix, pero nunca lo usaré en un nombre de archivo.
  4. La ruta no comienza con " / ". En caso de que cambie de opinión sobre la ejecución en un servidor de Windows, esto impide que se especifiquen rutas de red de Windows (es decir, " //someserver/someshare "). De nuevo, soy consciente de que una barra diagonal inversa es un nombre de archivo de Unix válido, pero tampoco la usaré en ningún nombre de archivo.

¿Son suficientes estos controles?

Fondo

Tengo un script PHP que toma (a través de la cadena de consulta) la ruta a un archivo fuente de muestra para ser mostrado a un usuario. Así que podría darles un enlace como " view_sample.php?path=accounting_app/report_view.php " o " view_sample.php?path=ajax_demo/get_info.js ".

El script se ve básicamente así:

$path = $_GET[''path'']; if(path_is_valid($path) && is_file("sample/$path")) { header(''Content-Type: text/plain''); readfile("sample/$path"); }

Mi preocupación es que un usuario malintencionado vea la URL e intente hacer algo como " view_sample.php?path=../../database/connection_info.php " y obtenga acceso a un archivo que no está en la "muestra" directorio.

¿Las cuatro comprobaciones que he definido anteriormente (que se implementarían en la función path_is_valid() ) son suficientes para bloquear a un usuario malintencionado? (Además, creo que los cheques 1, 3 y 4 son básicamente irrelevantes ya que estoy anteponiendo un camino relativo, pero si no lo hiciera, ¿serían suficientes los cheques?)


<?php // Current path information $path = $_GET[''path'']; $vroot = "sample"; // Validate that the $path is a subfolder of $vroot $vroot = realpath($vroot); if(substr(realpath($path), 0, strlen($vroot)) != $vroot or !is_dir($path)) {lid! exit("Invalid path"); } else { echo "Ah, everything is alright!"; } ?>


El uso de realpath no debe cambiar la ruta, así que lo uso de la siguiente manera:

function checkPath($pathToCheck) { global $basepath; $fullpath = $basepath.''/''.$pathToCheck; if ($fullpath==realpath($fullpath) && is_dir($fullpath)) { return $fullpath; } else { error_die(''path not allowed: ''.htmlentities($pathToCheck)); } }