Escribe plugins más seguros para tu WordPress

Debido a la oleada de bugs, problemas y fallos encontrados en las versiones más usadas de WordPress están saliendo muchos posts, de ayuda a los bloggers para mejorar la seguridad de sus sitios web, y esto está muy bien aunque no solo con eso conseguiremos estar completamente a salvo.

Como desarrollador he de asegurarme de que mis aplicaciones cumplan un mínimo de seguridad, ya sea para que nadie pueda robar información como para que la aplicación funcione contra viento y marea. Lamentablemente en un mundo tan vertiginoso como Internet en que las modas, tendencias y versiones son tan breves que es imposible estar a la última solo nos queda informarnos e informarnos y no dejar nunca de reciclarnos, aprender las nueves herramientas de las que disponemos para realizar nuestro trabajo y ya que las empresas no confian en la formación, ya que en la mayoría esta es nula o impensable, tienes que dedicar tiempo en casa para poder afrontar los problemas laborales con más herramientas.

Mi Sensei, JuanPe, me dijo una vez una frase de un tio famoso de esos que el lee:

Si solo tienes un martillo, tenderás a ver los problemas como clavos, en cambio si tienes más herramientas podrás ver los problemas desde un prisma más grande…

O algo, asi, que me perdone el tio ese tan famoso D

Bueno, todo este rollo era la introducción, pero he visto la película Click (la recomiendo, ha entrado en el ranking de mis preferías con un aplastante resultado) y he perdido un poco el norte. Lo único que quería era deciros que debemos mejorar nuestros plugins para WordPress y para ello tenemos a nuestra disposición muchas herramientas para conseguirlo.

En este artículo, nos explican como mejorar la seguridad de nuestros plugins usando una serie de funciones del propio WordPress para controlar nuestros datos, haré una traducción de las mias así que Dios nos pille confesados (expresión usada para decir que os agarreis que vienen curvas :D ).

attribute_escape();

El mayor problema que tenemos en las aplicaciones web es la interacción externa con la aplicación. Debido a que es algo que prácticamente es imposible de controlar hemos de limitar los posibles usos fraudulentos o erroneos de nuestros parámetros de entrada, ya sean POST o GET.

Para los que no conozcan esta terminología Web, solo decir y para entendernos, que los datos enviados por GET son los que vemos como parámetros en la barra de direcciones de nuestro navegador y que los datos de POST son aquellos que envian mediante un formulario a otra página de forma completamente invisible para el usuario.

Generalmente en PHP usamos un set de variables globales destinadas a alojar todos los parámetros que enviemos a nuestros scripts mediante alguna de las 2.

<?php
echo $_GET['param1']; //Imprimirá el valor del parametro param1
echo $_POST['param2']; //Imprimirá el valor del parámetro param2?>

Como podemos ver en el ejemplo el uso de estas variables globales es realmente sencillo, se tratan como variables normal, solo que estas variables son de solo lectura y no pueden modificarse su valor en el script de recepción.

Estos parámetros se reciben sin alterar, osea no se aplica ningún filtro a los datos enviados, por este motivo hemos de tratarlos antes de trabajar con ellos.

Para conseguir un nivel de seguridad generalizado a todo WordPress, este incorpora una función llamada attribute_escape(), que se encarga de “escapar” los parámetros para hacerlos inofesivos a nuestros scripts.

Pongamos un ejemplo de algo que pueda pasar.

http://www.url.com/?param1=hola's
...
mysql_query("SELECT * FROM tabla where texto = '".$_GET['param1']."'"); // Causará un error, aunque podría ocurrir algo mucho peor.

Creo que en el ejemplo podemos ver claro por donde quiero ir, hemos de limpiar nuestros parámetros de carácteres raros para evitar posibles problemas.

http://www.url.com/?param1=hola's
...
mysql_query("SELECT * FROM tabla where texto = '".attribute_escape($_GET['param1'])."'"); // No causará error y devolverá todo lo relacionado con hola's

De esta forma estamos convirtiendo el valor nuestro parámetro en uno válido para nuestro script.

wp_nonce_field() y wp_nonce_url()

Estas nuevas herramientas funcionan implantando un parámetro con un valor encriptado que a modo de semilla será informado por el desarrollador del plugin, de este modo conoceremos que es lo que debemos recibir como valor de ese campo y podremos cotejarlo con la semilla informada anteriormente, de esta forma estamos añadiendo un valor añadido más a nuestra aplicación.

if ( !function_exists('wp_nonce_field') ) {
        function myplugin_nonce_field($action = -1) { return; }
        $myplugin_nonce = -1;
} else {
        function myplugin_nonce_field($action = -1) { return wp_nonce_field($action); }
        $myplugin_nonce = 'myplugin-update-key';
}

Añadiremos algo similar a esto al inicio de nuestro plugin para comprobar que disponemos de estas propiedades y en caso negativo no causar un error de ejecución en nuestro script.

<form action= ...>
      <?php myplugin_nonce_field('$myplugin_nonce', $myplugin_nonce); ?>
       ...

En nuestro formulario añadiremos la llamada a nuestra función en la que informaremos el nombre y el valor del parámetro que queremos enviar a nuestra página receptora. Yá en ella añadiremos el código pertinente para cotejar el valor enviado.

if ( isset($_POST['submit']) ) {
      if ( function_exists('current_user_can') && !current_user_can('manage_options') )
      die(__('Cheatin’ uh?'));

      check_admin_referer( '$myplugin_nonce', $myplugin_nonce );

Con el uso de check_admin_referer() podremos comprobar el valor del parámetro enviado atraves de nuestro formulario.

Tambien podemos usar wp_nonce_url() para parámetro por GET visibles al usuario.

$delete_url = wp_nonce_url($get_url . "mode=del", '$adsense_nonce' . $myplugin_nonce);

Para los parámetros por GET tendremos que poner un parámetro señuelo que se encargará de abrirnos las puertas a la comprobación.

if($mode == 'del' ){
    check_admin_referer('$myplugin_nonce', $myplugin_nonce);

Bueno, conociendo esto ya estamos dando un gran paso en hacer que WordPress sea más seguro, ya que recordaremos aquel post loco que aNieto2k comentaba algo relacionado con la seguridad de WordPress.

aNieto2k

Tumblr4WordPress, ponle flores a tu WordPress

Tumblr4Wordpress es un theme muy florido que he portado del famoso layout Tumblr,  se trata de un diseño de dos columnas muy elegante y perfectamente encajado que hará las delicias de más de un hippie. El theme cumple los estandares para el xHTML 1.0 Transitional y además permite la tradución del mismo (si alguien me puede generar los ficheros .mo y .po me haría un favor).

untitled-1.png

Instalación

  1. Descargar el theme
  2. Descomprimir y subir a la carpeta wp-content/themes/
  3. Activar desde el panel de administración

[Descargar][Demo]

aNieto2k

Seguridad en WordPress

El tema de seguridad en WordPress ha sido siempre muy discutido. Algunos llaman a WordPress como “Wordstress”, otros, sentimos que WordPress si es seguro.

Actualmente, algunos blogs como Sigt y Carrero, han estado dando consejos de seguridad para WordPress, los cuales son muy interesantes y tienen ciertas alternativas para mejorar la seguridad de tu blog.

Yo he usado WordPress por bastante tiempo y solo una vez tuve problemas y fue gracias a un plugin llamado WP Database Backup.

¿Qué hacer para estar seguro en WordPress?

Realmente no es necesario crear tantos archivos .htaccess y comenzar a bloquear carpetas y subcarpetas. Lo mejor que se puede hacer es lo siguiente.

  • Utilizar una contraseña segura para tu cuenta
  • Utilizar pocos plugins, utilizar los que necesitas
    • Mucha gente nunca utiliza todos los plugins que tiene activados. Lo mejor es usar plugins que realmente necesitas y que veas que tienen un buen desarrollo y sean bien comentados en la comunidad WordPress. Ejemplo: Optimal Title, Ultimate Tags Warriors, etc.
  • Estar pendiente de los cambios en el TimeLine de WordPress y agregar los cambios en los archivos de tu blog (esto es si sabes lo básico de php, si no sabes, es mejor que no lo hagas)
  • Actualizar Siempre a las últimas versiones de WordPress

Siguiento estos consejos básicos, es muy difícil que hackeen tu blog.

Por supuesto, si de repente te has vuelto paranoico por lo se comenta en algunos blogs, puedes seguir los consejos de Sigt y Carrero, pero en mi opinión, esos consejos yo los seguiría, si vuelve a haber una época de gran cantidad de fallas de seguridad en WordPress. Por ahora (WordPress 2.2) es una versión bastante segura, los errores que tiene es a nivel de estética pero no de seguridad.

Ahora, otros consejos que no podían faltar ;)

  • No guardar respaldos de base de datos en los archivos de tu blog.
    • Me parece realmente peligroso y fui testigo de ello, que salvar respaldos de la base de datos de tu blog en alguna carpeta (ejemplo: wp-content) es lo peor que puedes hacer. Lo mejor, es utilizar los backups diarios que traen algunos hosting como Dreamhost.
  • Buscar reviews sobre plugins que vayas a utilizar.
    • Siempre tienes que buscar reviews o comentarios sobre plugins que vayas a utilizar. No vaya a ser, que actives un plugin que envie la base de datos a algún hacker.
  • Leer Planeta WordPress y AlexSEO.
    • En este blog, yo siempre estoy hablando sobre WordPress. Yo todos los días estoy revisando el Timeline de WordPress y diferentes sitios sobre seguridad, para saber si existen vulnerabilidades en plugins o en WordPress.

WordPress (2.x) y ficheros subidos

Hoy por casualidad he dado con un problema molesto, muy molesto, en WordPress 2.x, no he probado versiones anteriores. Se trata de un problema en el upload del sistema de posts, me he dado cuenta que posts antiguos con imagenes, estas han sido sobreescritas por imagenes más modernas, osea que imagenes que uso en posts como “La API de Digg ya ha empezado a dar sus frutos” que contienen imagenes y al ser más modernas han sobre escrito imagenes anteriores como en el posts “Microsoft Popfly, el pipes de Microsoft” o el de unZippy, y más que no me habré dado cuenta.

El problema es bastante chorra y generalmente no te das cuenta, a no ser que se cumpla una premisa.

  • El nombre de los ficheros que se suban no puede tener espacios.

Uno de los motivos por los que es dificil causar el error es que WordPress crea un sistema de directorios por mes y año para alojar los ficheros que subimos mediante la aplicación, por este motivo y sinó subimos muchas imagenes podemos nunca sufrir este desastre.

La función que comprueba el nombre del fichero en el directorio no aplica un filtro con el que convierte los espacios en guiones y por este motivo nunca encuentra el fichero.

Ejemplo:

Imaginemos que subimos el ficero “Soy Fichero.jpg”, este fichero al subirse sufre una transformación a “Soy-Fichero.jpg”, que es un nombre correcto para uso en web, si despues de unos días subimos un fichero con el mismo nombre “Soy Fichero.jpg” hará una comprobación y verá que no existe ya que no realiza el reemplazo a “Soy-Fichero.jpg” a la hora de comprobar el nombre sinó que lo busca con espacio.

¿Conclusión? Fichero sobreescrito, dejando posts con imagenes o archivos que no concuerdan con el archivo que quieres mostrar.

Solución

Le acabo de enviar un mail a Matt con el fallo para que lo tenga en cuenta, y por lo tanto no hay ningún parche o solución al problema, que repito, es muy molesto, he perdido 3 o 4 posts de imagenes que no tengo ya.

Por el mometo podemos hacer 2 cosas:

  1. Tener cuidado con el nombre de ficheros que subimos mediante WordPress, la más facil.
  2. Modificar el fichero admin-functions.php y añadir justo detrás de la definición de la funcion wp_handle_upload() (sobre la línea 1791) la siguiente línea.
function wp_handle_upload( &$file, $overrides = false ) {
        $file[’name’] = str_replace(” “, “-”,$file[’name’]);

aNieto2k

WP Digg Style Pagination: Plugin para paginación en WordPress

pagination.gif

WP Digg Style Pagination es un plugin para WordPress que permite paginar mejor las entradas del blog, sustituye el típico “siguiente – anterior” por un listado numérico de las páginas disponibles, al estilo Google, Digg y similares. Además el propio autor pone a disposición de todos el código CSS para emular la paginación de diferentes sitios populares de la red.

Ya existía un plugin similar, Pagebar, pero debido a los cambios en la estructura interna de WordPress no funciona correctamente, además de tener problemas de seguridad, por lo que es una buena idea pasarse a WP Digg Style Pagination.

Descubierto en 512 Megas.

WordPress en Español

Debido a que a mi me gusta usar mis propias palabras en las traducciones de WordPress, estoy comenzado a crear traducciones de las últimas versiones de WordPress. Esta es la traducción al español de WordPress 2.2, basada en la de Carrero.

0.1 – Esta es la versión inicial de la traducción al español de WordPress. Basada en la de Carrero, incluye algunos cambios en ciertas palabras del panel de administración WordPress.

Sugerencias, quejas, dudas o comentarios son bienvenidos.

No seas paranoico al usar WordPress

Esta bien ser paranoico al usar Windows pero no deberías ser lo al usar WordPress. Armonth ha escrito una lista de cinco consejos de seguridad para WordPress. La lista me parece muy buena, pero al leerla, puedes volverte paranoico. Realmente no es necesario crear tanto archivos .htaccess para impedir el acceso a ciertas carpetas, ponerte a eliminar archivos, cambiar el username, etc.

Sinceramente, lo más recomendable es lo siguiente:

  • Usar la última versión de WordPress. Por ejemplo, si en este momento usas WordPress 2.1.3, deberías migrar a WordPress 2.2 en este instante que lees mi post.
  • No utilizar tantos plugins. Tener plugins para WordPress no significa que debas usarlos todos. Lo mejor es usar pocos pero que realmente cumplan con lo que tú necesitas. Y además, estar pendiente de las actualizaciones de los plugins.
  • Leer blogs sobre fallos de seguridad en WordPress. Por ejemplo, puedes leer este blog, también BlogAntivirus (donde siempre estoy escribiendo sobre fallas de seguridad) y otros blogs como por ejemplo el de Armonth (el cual me parece un buen blog).

Dejen la paranoia, WordPress es un buen CMS, muy seguro y siempre está siendo actualizado.

PD: Si son paranoicos con Windows, usen Ubuntu D

Marchando una de noticias rápidas

Hacía tiempo que no escribía una noticia de este estilo, pero hoy no tengo mucho tiempo libre y hay muchas cosas que decir D

aNieto2k

Netemi: WordPress plugin anti-HOYGAN

Tengo más influencia de lo que pienso, últimamente hay una invasión de HOYGAN’s desaforados o es mucha casualidad pero ayer entre comillas me marque un fuera de tema:

[…] o al menos que no necesite un traductor HOYGAN-castellano (y por cierto, un plugin que detecte los comentarios 100% en mayúsculas y los ponga en minúscula salvo a principio de frase o después de punto seguramente ayudaría y mucho xDDD) y ahorrarse los insultos.

Y al día siguiente sacan Netemi, aunque me parece que a lo máximo que yo llego es a “motivar” el lanzamiento (suponiendo que lo hayan leído xD), parece que el primer boceto es de hace año y medio.

Bueno, el caso es que Netemi en resumidas cuentas detecta los comentarios ESCRITOS 100% EN MAYÚSCULAS y los pone en minúsculas, un plugin 100% anti-hoygan. A ver si tengo un rato y le echo un buen vistazo.

,

Cinco consejos de seguridad para WordPress

Con el tiempo y la experiencia uno se va dando cuenta de que los riesgos (siempre presentes) en la seguridad de scripts en PHP y especialmente WordPress — el que más conozco — se pueden minimizar, aquí van 5 consejos enfocados 100% a WordPress para ello:

  1. Desactiva wp-db-backup. Los motivos son de sobra conocidos, un fallo en este plugin o cualquier otro fallo que dé acceso a una cuenta de administrador permite al atacante descargar una copia de la base de datos.

    Como administrador, el atacante puede generar muchos daños: borrar artículos, comentarios, insultar en tu nombre, borrar usuarios, cambiarles las contraseñas pero si no puede hacerse con una copia de la base de datos “en principio” no puede saber la contraseña de los otros posibles usuarios. No es ningún consuelo y realmente ante un ataque lo mejor es cambiar las contraseñas de todos los usuarios pero si son muchos y esto no es posible es mejor que no acceda a la BBDD: mejor tener que cambiar una contraseña que no todas.

    Además, wp-db-backup guarda la BBDD en un directorio generado aleatoriamente dentro de wp-content: nunca se deben guardar backups accesibles por web, es mejor tenerlos fuera (y si aún así acceden a ellos es que ya tienen control sobre toda tu máquina), un fallo en Apache podría hacer que medidas como el no mostrar el índice de ficheros dejarán de ser efectivas y obtener la BBDD fácilmente. Si aún así quieres usarlo algunas opciones a tener en cuenta son:

    • Añade un .htaccess en el directorio de backups que impida el listado de ficheros del directorio:

      Options -Indexes
    • Obliga a introducir una contraseña para acceder al directorio de backups, en el .htaccess debajo de lo anterior añade:

      AuthUserFile /home/tuusuario/.htpasswd
      AuthGroupFile /dev/null
      AuthName EnterPassword
      AuthType Basic
      require user usuarioparaacceder

      El directorio /home/tuusuario/ debe ser un directorio fuera del acceso a la web por ejemplo si el raíz de tu web es /home/tuusuario/tudominio.com el fichero .htpasswd debe estar fuera de tudominio.com: nunca dejes el fichero .htpasswd accesible por web.

      Una vez hecho esto, creamos el fichero .htpasswd con el contenido siguiente que será el usuario y la contraseña separados por dos puntos juntos (:):

      usuarioparaacceder:contraseñaparaacceder

      Sobra decir que las rutas (/home/tuusuario) y usuarioparacceder debe coincidir en los dos ficheros.

  2. Elimina los ficheros de instalación y los importadores. Una vez hecha la instalación o actualización de WordPress se deben borrar los ficheros de instalación:

    /wp-admin/install.php
    /wp-admin/upgrade.php
    /wp-admin/installer-helper.php

    El tercero es opcional (aunque todo código que no sea necesario se debe borrar), el primero y segundo si no se borran son un agujero de seguridad del tamaño del Gran Cañón del Colorado. Luego además podemos borrar los importadores:

    Los importadores (los ficheros de dentro de wp-admin/import/) sirven para importar contenido (es decir: modificar la base de datos) desde otros sistemas de blogging por lo que pueden ser vulnerables a ataques otra vez más la máxima es: si no lo necesito lo borro. ¿Quién importa a WordPress entradas desde 15 sistemas distintos? Pues eso: borra los que no uses.

  3. Limita el uso de plugins. Los plugins suelen ser vulnerables, sobretodo a ataques XSS (una plaga hoy en día), si puedes prescindir de un plugin no lo dudes y hazlo.

    Los plugins que potencialmente son más peligrosos son aquellos que permiten la entrada de parámetros mientras que aquellos que solo devuelven una salida (por ejemplo: añadir un dato sacado de la BBDD al diseño de la web) lo son menos.

  4. Protege /wp-admin/. De la misma forma que en el primer paso hemos protegido el directorio de backups, podemos hacerlo para el directorio /wp-admin/, quizá sea algo molesto pero si sabes a ciencia cierta en un momento dado que tu WordPress es vulnerable en el directorio wp-admin y todavía no hay solución puedes activar momentaneamente esta restricción.

  5. Utiliza una cuenta de autor. El bug anterior es un buen ejemplo: permite editar información de usuarios si estás como administrador.

    Crea una segunda cuenta con privilegios de “Autor” y usara para escribir, comentar, moderar comentarios, etcétera. Si en algún momento tienes que des/activar un plugin o editar un comentario de otro usuario tendrás que entrar como administrador pero es un mal menor.

    Por ejemplo, mi usuario es un “Autor” pero mediante los “Roles” tiene como permisos extendidos editar páginas/entradas (propias), moderar comentarios (sólo permite los tuyos), subir ficheros y escribir HTML no filtrado. Mientras que el resto de “Autores” tienen permisos básicos pero no pueden moderar…

    Las tareas tales como activar plugins, importar, administrar opciones, editar ficheros / plugins / plantillas / usuarios, administrar categorías / encuestas o cambiar temas requieren que entre como administrador pero no suelo necesitarlo

  6. (Bonus) Lee sitios que anuncien fallos: aquí en SigT solemos dar la brasa bastante con temas de WordPress, además que considero más práctico parchear (cuando son pocas líneas) que no “obligar” a actualizar todo WordPress cada vez, en Buayacorp Alex suele dar la brasa a los desarrolladores de WordPress con fallos y en el Planet Webdev o el Planeta WordPress cada vez que aparece un fallo de seguridad damos la brasa a lo menos 10 bloggers distintos por cada Planet: sale un bug y aparecen 20 entradas ;) .

  7. (Bonus II) Quita el usuario administrador: o mejor dicho: desactiva el primer usuario administrador. Truco sólo para gente que sepa lo que hace. Muchos exploits automáticos atacan al user_ID = 1 de wp_users en la base de datos, una posible táctica para que estos exploits fallen sería (aunque aviso que hay que probarlo bien, no sea que algún plugin o algo también falle):

    • Crea un nuevo usuario con permisos de administrador (para que tenga un user_ID distinto).
    • Deja el usuario admin antiguo como “lector” (sin privilegios).

Actualmente WordPress se ha ganado el nombre de WordStress a pulso pero considero que los desarrolladores trabajan duro para solucionar los problemas, creo que poco a poco se hará menos común el ver tantos fallos seguidos en tan poco tiempo.

, ,