July 30 2008

Hackeando el plugin MyFTP

MyFTP es un plugin muy útil que te permite tener un mini cliente FTP dentro de tu Dashboard de Wordpress, hace poco se me planteo una simple necesidad, que el usuario pudiera subir archivos de cualquier tipo y luego compartirlos como él quisiera. Por experiencia, todos sabemos que cuando le pones demasiados botoncitos y carpetitas al usuario irremediablemente terminará clickando por "accidente" el botón de borrar, pues como bien indica el autor de este plugin, realmente es tan poderoso que puedes borrar lo que quieras. Imagínense eso en las manos del típico usuario tentón que cree que la página que se le entrega es una mujer facilota dispuesta a ser manoseada por todos lados. Pues simplemente no podemos confiar en él, recuerden la filosofía Housiana... "el usuario miente" y nunca te dirá que él se jodió la carpeta themes y que por eso ya no se ve el tema del blog, o se cargo toda la carpeta upload y por eso ya no existen más los archivos.

Como él miente y nosotros queremos quitárnoslo de encima, vamos a hacerle un pequeño ajuste a este plugin para encasillar al usuario en un solo directorio y que no pueda salir de ahí, así si se carga sus archivos, será culpa única y exclusivamente de él, y nosotros habremos salvado a un usuario pobre de morir ahorcado con un cable usb.

Primero lo primero, instalar el plugin

Descarguemos el plugin desde aquí, procedamos a descomprimirlo, subirlo a nuestro servidor en el directorio de plugins de Wordpress y activarlo. Después de activarlo, vamos a Settings, ahí encontraremos una opción llamada MyFTP, el plugin luce así

MyFTP Plugin de Wordpress

Modificando el plugin

Tentadores esos botones de Delete File y Delete Folder, ¿no es cierto? Además, notemos que estamos en el home de nuestro servidor, por lo que podemos borrar lo que queramos, así que vamos de una vez a bloquear el acceso. Vamos a modificar los archivos de forma local y luego subiremos nuestro resultado al servidor. Abra el archivo myftp.php y localice la función myFtp2, que luce así

PHP:
  1. function myFtp2(){
  2. if($_GET["dir"] == "" || !is_dir($_GET["dir"])){
  3. $dir = getcwd();
  4. $dir = str_replace("\\", "/", $dir);
  5. $dir = explode("/",$dir);
  6. array_pop($dir);
  7. $dir = implode("/",$dir);
  8. }else{
  9.  $dir = $_GET["dir"];
  10. }

La reemplazaremos por

PHP:
  1. function myFtp2(){
  2. if($_GET["dir"] == "" || !is_dir($_GET["dir"])){
  3. $dir = "/esta/es/la/ruta/física/del/directorio/del/usuario";
  4. }else{
  5.  $dir = $_GET["dir"];
  6. }

Luego, cerca de la línea 155, encontraremos este pequeño fragmento de código

PHP:
  1. <form  method="post" enctype="multipart/form-data" action="<?php echo  $_SERVER["PHP_SELF"] . "?page=MyFtp&dir=".str_replace('\\', '/', get_home_path()); ?>">

Que reemplazaremos por:

PHP:
  1. <form  method="post" enctype="multipart/form-data" action="<?php echo  $_SERVER["PHP_SELF"] . "?page=MyFtp&dir=".str_replace('\\', '/', '/este/es/el/directorio/físico/del/usuario'); ?>">

Luego, por la línea 171, encontraremos un echo muy grande, este para ser exactos

PHP:
  1. echo"<div id='displayTables'><table border=1 cellspacing=0 cellpadding=2 width='65%' align='center'>
  2.   <tr><th align=center bgcolor=#83b4d8 colspan='3'><font size='5' color=white> Your Currently Browsing:</font><br /><br />".$dir."<br />&nbsp;</th></tr><tr><th align=center colspan='3'><ul id='submenu'><li><a href='" . $_SERVER["PHP_SELF"] . "?page=MyFtp&dir=".str_replace('\\', '/', get_home_path())."'>Home</a></li>&nbsp;&nbsp;&nbsp;<li><a href='" . $_SERVER["PHP_SELF"] . "?page=MyFtp&dir=$parentDir'>Up One Level</a></li>&nbsp;&nbsp;&nbsp;<li><a href=' javascript:history.back()'>Back One Level</a></li></ul></th></tr>";

Que vamos a reemplazar por

PHP:
  1. echo"<div id='displayTables'><table border=1 cellspacing=0 cellpadding=2 width='65%' align='center'>
  2.   <tr><th align=center bgcolor=#83b4d8 colspan='3'><font size='5' color=white> Your Currently Browsing:</font><br /><br />".$dir."<br />&nbsp;</th></tr>";

Ahora, el plugin ofrece una caja de texto editable con la ruta actual, eso tampoco nos conviene, localicemos la siguiente línea

PHP:
  1. Current Path: <input type="text" name="desiredLocation" size="<?php echo strlen($dir) + 10; ?>" value="<?php echo $dir; ?>"><br /><br />

Y la vamos a reempleazar por

PHP:
  1. Current Path: <?php echo $dir; ?> <input type="hidden" name="desiredLocation" size="<?php echo strlen($dir) + 10; ?>" value="<?php echo $dir; ?>"><br /><br />

En resumen, lo que hemos hecho fue quitar los botones de Home, Up One Level y Back One Level, así como quitar la caja de texto subtituyendola por un objeto hidden para no perder la ruta que hemos establecido. Guardemos los cambios. Ahora, hay que abrir el archivo myftpFunctions.php y encontrar la función homeDir

PHP:
  1. function homeDir(){
  2. $hdir = getcwd();
  3. $hdir = str_replace("\\", "/", $hdir);
  4. $hdir = explode("/",$hdir);
  5. array_pop($hdir);
  6. $hdir = implode("/",$hdir);
  7. return $hdir;
  8. }

Le haremos un pequeño cambio

PHP:
  1. function homeDir(){
  2. $hdir = "/esta/es/la/ruta/física/del/directorio/del/usuario";
  3. return $hdir;
  4. }

¡Y listo! Hay que guardar este otro archivo, subir de nuevo el plugin a la carpeta de plugins de wordpress en nuestro servidor y actualizar.

Plugin MyFTP para wordpress

Nota importante: El plugin esta bajo licencia GNU y es propiedad de su autor, yo solo le hice algunos ajustes para adaptarlo a una necesidad, en ningún momento me estoy adjudicándo la creación de dicho plugin

Post Relacionados

Comments:

(01) posted on Hackeando el plugin MyFTP

Post a comment

RSS
Búsqueda personalizada

Encuesta

  • ¿Qué te gustaría ver con más regularidad en el blog?

    View Results

    Loading ... Loading ...

Etiquetas