elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Cambiar de directorio
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Cambiar de directorio  (Leído 8,261 veces)
gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: Cambiar de directorio
« Respuesta #10 en: 27 Mayo 2016, 19:09 pm »

Dejo la versión 1.0 release del script  ;D

Sigo sin saber por qué te salia el botón en el directorio raiz, pero ahora sé que estás en Windows y el separador de directorios es la barra invertida en lugar de la normal. El script ahora soporta Windows también:

Código
  1. $newPath = $_GET['move'] ?? NULL;
  2. $slash   = DIRECTORY_SEPARATOR; // \ for Windows and / for the rest
  3. $levels  = count(explode($slash, $newPath)) - 1;
  4. $baseDir = 'C:\\Apache\\htdocs\\'; // Absolute path to document root
  5.  
  6. $folder  = realpath($baseDir . $newPath);  // Checks for a valid and existent path
  7.  
  8. if ( NULL !== $newPath ) {
  9.    if (dirname($folder, $levels) !== $baseDir) die('Sorry I just died :P'); // Hack attempt
  10. }
  11.  
  12. if ( FALSE !== $folder && is_dir($folder) ) {
  13.  
  14.    $files          = new FileSystemIterator($folder, FileSystemIterator::SKIP_DOTS);
  15.    $privateArray   = [ '.htaccess' => '', 'h4x0r stuff' => '', 'etc...' => '' ]; // List of excluded files and folders
  16.  
  17.    if ( FALSE !== $files ) {
  18.  
  19.        if ( isset($newPath) && $newPath != '' ) {
  20.  
  21.            $dirName = dirname($newPath);
  22.            $backDir = $dirName == $slash ? '' : '?move=' . $dirName;
  23.  
  24.            echo '<a href="/test' . $backDir . '">Go Back</a><br />';
  25.  
  26.        }
  27.  
  28.        foreach ( $files as $file ) {
  29.  
  30.            $baseName = basename($file);
  31.  
  32.            if ( !isset($privateArray[$baseName]) ) {
  33.  
  34.                $dir = is_dir($file)
  35.                          ? (isset($newPath) ? '?move=' . $newPath . $slash . $baseName : '?move=' . $slash . $baseName)
  36.                          : '#';
  37.  
  38.                echo '<a href="/test', $dir, '">', $file, '</a><br />';
  39.  
  40.            }
  41.        }
  42.    }
  43. }

La dirección base tiene que ser absoluta, en Windows empezando por la letra de la unidad, que suele ser C.

Con realpath() ya te aseguras de que no se salga del document root, pero dará un error, para evitar esto se hace una pequeña comprobación y si se cumple entonces se termina el script y no se sigue ejecutando. También sirve por si quieres mostrar solo a partir de un subdirectorio y si se intenta subir con .. entonces realpath no dará error, pero la comprobación terminará el script y se evitará que se muestren directorios que no permites.

También he añadido otra comprobación por si se quieren excluir archivos y carpetas. Lo que no quieras que se muestre añadelo a la lista. Como se comprueba por key (nombre de archivo/carpeta) hay que darle un valor cualquiera (en este caso '') a cada elemento del array (lista).


En línea

Moand

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Cambiar de directorio
« Respuesta #11 en: 27 Mayo 2016, 20:05 pm »

Ya he conseguido ordenador el resultado primero por carpetas y luego por ficheros.

No se si es la forma mas correcta, pero lo que he hecho ha sido crear if en el foreach para que únicamente muestre los directorios ya que con los operadores ternarios me obligaban a poner un else (":"), y por lo tanto, mostraba también los ficheros. Luego he creado otro foreach para los ficheros.

Código
  1. <?php
  2.  
  3.  $newPath = $_GET['move'] ?? NULL;
  4.  $folder = realpath("../usuarios" . $newPath);
  5.  
  6.  if ( $folder == TRUE && is_dir($folder) ) {
  7.  
  8.    $files  = new FileSystemIterator($folder);
  9.  
  10.    if ( $files == TRUE ) {
  11.  
  12.      $back_dir = dirname($newPath) == '/' ? '' : dirname($newPath);
  13.      echo isset($newPath) ? ($newPath == '' || $newPath == '\\' ? '' : '<a href="?move=' . $back_dir . '">Go Back</a><br>') : '';
  14.  
  15.      foreach ( $files as $file ) {
  16.        if (is_dir($file) === TRUE) {
  17.          if (isset($newPath) === TRUE) {
  18.  
  19.            $dir = '?move=' . $newPath . '/' . basename($file);
  20.            echo '<a href="', $dir, '">', $files, '</a><br>';
  21.  
  22.          }else {
  23.  
  24.            $dir = '?move=/' . basename($file);
  25.            echo '<a href="', $dir, '">', $files, '</a><br>';
  26.  
  27.          }
  28.        }
  29.      }
  30.  
  31.      foreach ($files as $file) {
  32.        if (is_file($file) === TRUE) {
  33.  
  34.          echo '<a href="#">', $files, '</a><br>';
  35.  
  36.        }
  37.      }
  38.    }
  39.  }
  40.  
  41. ?>

No esta modificado en el ultimo código que pusiste porque ya lo empece con este, pero seria prácticamente igual. Por si quieres usarlo.

También yo estoy usando $files en las etiquetas <a> porque así me muestra únicamente el nombre del archivo o directorio  :D


En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: Cambiar de directorio
« Respuesta #12 en: 27 Mayo 2016, 20:15 pm »

Lo de dirname() es porque antes estaba usando el separador de unix / y en windows es \ por lo tanto:

Código
  1. $backDir = $dirName == '/' ? '' : '?move=' . $dirName;

En tu caso tu botón tiene /test?move=\ y el mio /test. Esto resuelve el misterio de porqué a tí se te muestra el botón en el directorio raiz, al ser la url /test?move=\ entonces $newPath ya no es NULL y entonces se muestra el botón.

Antes de PHP 7, dirname mostraba el primer directorio: /dir1/dir2/dir3 -> /dir1 o C:\dir1\dir2\dir3 -> C:\dir1. Ahora sube 1 nivel por defecto, con la adicción del parámetro adicional levels, que puedes elegir cuantos subir.

Todo estó quedo arreglado en la versión 1.0  ;D

Aaalaaaaaa  :o hahahaha  ;D (al menos no es tanto como lo que intenté hacer una vez...  :silbar:)

Mira esta manera parece más complicada?  :rolleyes:

Código
  1. // IMPORTANT: Requires PHP >= 7
  2.  
  3. $newPath = $_GET['move'] ?? NULL;
  4. $slash   = DIRECTORY_SEPARATOR; // \ for Windows and / for the rest
  5. $levels  = count(explode($slash, $newPath)) - 1;
  6. $baseDir = '/home/admin'; // Absolute path to document root
  7.  
  8. $path  = realpath($baseDir . $newPath); // Checks for a valid and existent path within the document root
  9.  
  10. if ( NULL !== $newPath ) {
  11.    if (dirname($path, $levels) !== $baseDir) die('Sorry I just died :P'); // Hack attempt
  12. }
  13.  
  14. if ( FALSE !== $path && is_dir($path) ) {
  15.  
  16.    $files          = new FileSystemIterator($path, FileSystemIterator::SKIP_DOTS);
  17.    $privateArray   = [ '.htaccess' => '', 'h4x0r stuff' => '', 'etc...' => '' ]; // List of excluded files and folders
  18.    $folder_list    = $file_list = '';
  19.  
  20.    if ( FALSE !== $files ) {
  21.  
  22.        if ( isset($newPath) && $newPath != '' ) {
  23.  
  24.            $dirName = dirname($newPath);
  25.            $backDir = $dirName == $slash ? '' : '?move=' . $dirName;
  26.  
  27.            echo '<a href="/test' . $backDir . '">Go Back</a><br />';
  28.  
  29.        }
  30.  
  31.        foreach ( $files as $file ) {
  32.  
  33.            $baseName = basename($file);
  34.  
  35.            if ( !isset($privateArray[$baseName]) ) {
  36.  
  37.                if ( is_dir($file) ) {
  38.  
  39.                    $dir = isset($newPath) ? '?move=' . $newPath . $slash . $baseName : '?move=' . $slash . $baseName;
  40.  
  41.                    $folder_list .= '<a href="/test' . $dir . '">' . $file . '</a><br />';
  42.  
  43.                }
  44.  
  45.                if ( is_file($file) ) {
  46.                    $file_list .= '<a href="#">' . $file . '</a><br />';
  47.                }
  48.  
  49.            }
  50.        }
  51.  
  52.        echo $folder_list, $file_list;
  53.  
  54.    }
  55. }

Ahora es más facil darle estilo a la lista.
En línea

Moand

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Cambiar de directorio
« Respuesta #13 en: 28 Mayo 2016, 15:51 pm »

No se si a ti te ocurre la mismo, pero cuando bajo un nivel no me permite ir al nivel principal. Sin embargo, cuando bajo dos niveles si me deja ir al nivel anterior.

Si desde el navegador lo miro me aparece asi:


Si la parte del "Go back" la reemplazo por esto:

Código
  1. $back_dir = dirname($newPath) == $slash ? '' : dirname($newPath);
  2.      echo isset($newPath) ? ($newPath == '' ? '' : '<a href="?move=' . $back_dir . '">Go Back</a><br>') : '';

Si sube el nivel, pero da un error


Lo intentaría solucionar pero es que no entiendo muy bien lo de "levels". Creo que lo que hace es contar el numero de directorios que hay usando como separador \ o /  :huh:



Vale, creo que ya se por que es. Como estoy en Windows seguramente también cuenta la letra de mi unidad, es decir, en Linux empezaría a contar después de la raíz y en Windows desde la letra.

C:\nivel1\nivel2\nivel3 --> Aquí lo contaría como 4
/nivel1/nivel2/nivel3 --> Aquí lo contaría como 3
« Última modificación: 28 Mayo 2016, 23:18 pm por Moand » En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: Cambiar de directorio
« Respuesta #14 en: 28 Mayo 2016, 23:55 pm »

Eso no tiene sentido, E:\ y / son lo mismo, ambos son root. \ y / son simplemente separadores, no directorios en si.

Lo que pasa es que el directorio base (o root) en Linux es siempre el mismo, pero en Windows depende de la partición en la que estás (esta será el directorio base). No sé si me explico.

Windows -> A:\, B:\, C:\, etc...

Linux -> /

El document root (o base) de apache es el directorio en el que puedes trabajar: Solo puedes leer y escribir dentro de el (desde la web, ya sea html o php), por eso realpath da error si te sales de el (salierte en este caso quiere decir subir un directorio, puedes bajar todo lo que quieras).

En tu caso sería -> E:\Programas\Xampp\htdocs
En mi caso sería -> /home/admin

Estás usando el viejo script. Haz una prueba y copia mi ultimo script tal cual y comprueba si te da error. Ya que es compatible con windows y linux y no debería de ocurrirte eso, ya que amí no me ocurre.
En línea

Moand

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Cambiar de directorio
« Respuesta #15 en: 29 Mayo 2016, 02:30 am »

Yo lo único que hago es cambiar la ruta y quitar el "/test".

Código
  1. <?php
  2.  
  3. $newPath = $_GET['move'] ?? NULL;
  4. $slash   = DIRECTORY_SEPARATOR; // \ for Windows and / for the rest
  5. $levels  = count(explode($slash, $newPath)) - 1;
  6. $baseDir = 'E:\Programas\Xampp\htdocs'; // Absolute path to document root
  7.  
  8. $path  = realpath($baseDir . $newPath); // Checks for a valid and existent path within the document root
  9.  
  10. if ( NULL !== $newPath ) {
  11.    if (dirname($path, $levels) !== $baseDir) die('Sorry I just died :P'); // Hack attempt
  12. }
  13.  
  14. if ( FALSE !== $path && is_dir($path) ) {
  15.  
  16.    $files          = new FileSystemIterator($path, FileSystemIterator::SKIP_DOTS);
  17.    $privateArray   = [ '.htaccess' => '', 'h4x0r stuff' => '', 'etc...' => '' ]; // List of excluded files and folders
  18.    $folder_list    = $file_list = '';
  19.  
  20.    if ( FALSE !== $files ) {
  21.  
  22.        if ( isset($newPath) && $newPath != '' ) {
  23.  
  24.            $dirName = dirname($newPath);
  25.            $backDir = $dirName == $slash ? '' : '?move=' . $dirName;
  26.  
  27.            echo '<a href="' . $backDir . '">Go Back</a><br />';
  28.  
  29.        }
  30.  
  31.        foreach ( $files as $file ) {
  32.  
  33.            $baseName = basename($file);
  34.  
  35.            if ( !isset($privateArray[$baseName]) ) {
  36.  
  37.                if ( is_dir($file) ) {
  38.  
  39.                    $dir = isset($newPath) ? '?move=' . $newPath . $slash . $baseName : '?move=' . $slash . $baseName;
  40.  
  41.                    $folder_list .= '<a href="' . $dir . '">' . $file . '</a><br />';
  42.  
  43.                }
  44.  
  45.                if ( is_file($file) ) {
  46.                    $file_list .= '<a href="#">' . $file . '</a><br />';
  47.                }
  48.  
  49.            }
  50.        }
  51.  
  52.        echo $folder_list, $file_list;
  53.  
  54.    }
  55. }
  56.  
  57. ?>

Por lo demás esta todo igual. Y es verdad, no es por eso porque también lo acabo de probar en Ubuntu.
En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: Cambiar de directorio
« Respuesta #16 en: 29 Mayo 2016, 03:05 am »

Pues necesitas una url a la que volver, /test no está por gusto  ;D

Me explico mejor: /test seria el document root, cuando estas en /test?move=\mi carpeta entonces entonces dirname($netPath); es \ y cuando $dirname == $slash, $backDir = '' y el href es "".

¿Que ocurre cuando un link tiene un href vacio? Que hace una petición a la misma página. Por eso tienes que poner tu archivo (que es el document root) en el href.

Si tu archivo es pru.php entonces href="/pru.php" y ese es el document root:

Cuando te encuentres en web.com/pru.php?move=\mi carpeta, el boton "Go back" será href="/pru.php" y podrás ir atras.

Lo que no entiendo es lo que has hecho para que te saliera: <a href> asi sin más xD a eso le falta ="". Eso quiere decir que cambiaste algo más...  :rolleyes:
En línea

Moand

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Cambiar de directorio
« Respuesta #17 en: 29 Mayo 2016, 13:22 pm »

Vale, ya lo entiendo.   :)

Es que como tu tenias puesto /test me confundió porque creía que era para que te redirigiera allí. Y encima en el anterior lo quite y funcionaba sin eso.  :P

Cuando tienes puesto href="", el navegador lo muestra como href  sin nada xD

Muchas gracias por tu ayuda  ;D
En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: Cambiar de directorio
« Respuesta #18 en: 29 Mayo 2016, 20:14 pm »

Perfecto, ya puedes marcar la pregunta como resuelta  ::)
En línea

Moand

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Cambiar de directorio
« Respuesta #19 en: 30 Mayo 2016, 19:46 pm »

Así es, muchas gracias :D
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cambiar directorio un archivo
Desarrollo Web
Ahm_Shere 1 2,537 Último mensaje 5 Julio 2010, 21:17 pm
por Pazador
Cambiar directorio de SOURCES (WDK)
Programación C/C++
DaasCook 3 2,598 Último mensaje 16 Marzo 2011, 16:52 pm
por Eternal Idol
como cambiar permisos en ubuntu a un directorio
GNU/Linux
Paul Young 1 1,992 Último mensaje 2 Enero 2013, 16:53 pm
por Paul Young
Cambiar directorio raiz en .htaccess
Desarrollo Web
soru13 1 2,627 Último mensaje 21 Julio 2013, 13:53 pm
por z3nth10n
Como cambiar el directorio de un programa en c++
Programación C/C++
alpachino98 2 2,467 Último mensaje 23 Julio 2017, 01:15 am
por alpachino98
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines