Los 3 modos más comunes de hackear WordPress y cómo evitarlo

WordPress es ya el CMS más utilizado y popular, y ese poder conlleva una responsabilidad, la de ser también el CMS más atacado por hackers que quieran hacerse con el control de tal o cual web … hecha con WordPress.

Y no te creas que si tu WordPress no es una web popular no sufrirá ataques, pues muchos de los “exploits” que se crean son para hacer webs zombie, y para eso les vale cualquiera.

De todos los modos que hay de hackear una web, los 3 que más se dan en WordPress, las principales vías de entrada para ataques, son las siguientes:

1. Temas y plugins sin actualizar

Instalar y actualizar temas y plugins en WordPress es muy fácil, y con el sistema de avisos de nuevas versiones integrado, salvo situaciones especiales, no hay motivos para no actualizarlos cuando hay nuevas versiones.

Además, la mayoría de las actualizaciones suelen ser por cuestiones de seguridad que podrían poner en peligro tu web, salvo cuando hay un cambio de versión mayor en WordPress, que entonces obliga a cambiar ciertos códigos en algunos plugins y temas. El resto de las ocasiones, especialmente en los temas, es prácticamente obligatorio actualizarlos.

Muchas veces hablamos de la conveniencia – o no – de los plugins y temas de pago, y una de sus ventajas debe ser el aliciente para el desarrollador de estar pendiente de nuevos ataques o “exploits” y actualizar su producto para solucionarlos, algo que con los temas y plugins gratuitos no siempre es así.

Soluciones

  • Mantén actualizado WordPress a la última versión
  • Mantén actualizados los plugins WordPress
  • Mantén actualizados los temas WordPress
  • Aprende los peligros de los plugins WordPress

Fácil ¿no?

2. Datos de acceso débiles


Actualmente puedes elegir el nombre de usuario administrador al instalar WordPress, y sino cambiarlo nada más terminar la instalación, pero aún hay muchos WordPress con el usuario por defecto de nombre admin, y con eso cualquier intruso ya tiene la mitad de la información para acceder a tu WordPress como administrador.

Si a esto le sumas una contraseña simple, fácil de adivinar o que uses en otros servicios online no siempre seguros, estás más que expuesto a posibles accesos no deseados. Es algo que debes solucionar lo antes posible.

Soluciones

3. Inyecciones en la base de datos

Este es quizás el método más empleado últimamente para hackear cualquier CMS, WordPress incluido, y lo malo es que no siempre depende de ti que las bases de datos estén seguras, pero al menos hemos de hacer nuestro trabajo para asegurarlas lo máximo posible.

Lo peor es que si un hacker entra en tu base de datos estás perdido del todo, puede hacer lo que sea, no hay límites. Además, luego limpiar una base de datos infectada es un absoluto horror, de lo peor que te puede ocurrir.

Soluciones

Y hasta aquí las 3 maneras más comunes en que suele haber hackeos de WordPress. Vamos a ver si tenemos ayudas genéricas …

Avisos de seguridad de Google

Es horrible cuando visitamos una web y Google nos avisa de que es insegura y puede infectar nuestro sistema, pero para el webmaster es, al menos, un aviso de que algo ha pasado.

Para ello es fundamental que tengas una cuenta en Google Webmaster Tools para gestionar ahí tus webs y poder tener avisos de seguridad e incluso instrucciones de como solucionar intrusiones. Además, Google ya te avisa incluso de cuando tienes que actualizar WordPress.

Luego, en su mismo panel puedes avisarle a Google de que tu sitio está limpio y quitará, tras comprobarlo, el molesto aviso.

¿Cómo evitar problemas de seguridad en WordPress?

Todo esto, como ves está muy bien pero ¿como evito este tipo de intrusiones, hackeos e inyecciones de código?, pues siendo exhaustivo en los básicos, que no me cansaré de repetir:

  • Mantener WordPress actualizado a la última versión, única garantía de control de vulnerabilidades conocidas.
  • Instalar solamente plugins seguros, a ser posible desde el repositorio oficial.
  • Instalar solamente temas seguros, a ser posible desde el repositorio oficial.
  • Asegura WordPress con plugins especializados
  • Revisar la sección de seguridad de Ayuda WordPress para comprobar que has realizado todas las acciones de seguridad necesarias.
  • Suscribirte al feed de Ayuda WordPress para estar informado de las alertas de seguridad.

Servicios WordPress seguros

Ahora bien, si no quieres preocuparte de la seguridad de tu WordPress, siempre puedes recurrir a servicios que te quiten de problemas:

  1. Utiliza un WordPress administrado como WordPress.com, simplemente escribes y te olvidas de todo
  2. Haz backup de todo, tienes muchos plugins que automatizan las copias de seguridad diarias, para casos de desastre
  3. Contrata un hosting especializado en WordPress que haga copia de seguridad automática de tu sitio
  4. Install a premium plugin which automatically creates a full backup and sends it to a storage location of your choice.

Para finalizar, y a pesar de que este tipo de artículos a veces acojonan un poco, WordPress es el CMS más seguro.

QueryPosts, como debería ser el Codex de WordPress

El Codex es la Biblia de WordPress, pero siempre he pensado que le falta una funcionalidad para documentarse rápidamente de cualquier función o hook necesario para programar.

Si tuviera que elegir la próxima herramienta del Codex tengo claro que sería algo muy parecido a QueryPosts.

QueryPosts es una web que ofrece un buscador predictivo (muestra resultados mientas escribes) de funciones WordPress y, una vez identificada la que quieres te ofrece a continuación, primero, una lista de los argumentos que puedes utilizar, así como la ruta donde se “llama” a la función.

En esa pantalla, además, puedes hacer clic en el nombre de función para, a continuación, disponer de una pantalla completísima en la que se nos describe la misma, sus usos y se nos dan hasta ejemplos. Todo muy visual, sencillo y utilizable.

queryposts4 queryposts3

Vamos, lo que debería tener el Codex ¿no te parece?.

Quitar la fecha visible en tu tema WordPress

No siempre uno quiere que, junto a los artículos, se muestre la fecha en que se publicaron. Lo que pasa es que muchos temas WordPress, la verdad es que la mayoría, incorporan esa “utilidad“, y se empeñan en mostrar la fecha de publicación.

Pero vamos, no te preocupes, es fácil quitar ese elemento ¿molesto?

Como siempre, vamos a ver como quitar la fecha de publicación de dos maneras:

1. Quitar la fecha de publicación en el código

En realidad es muy fácil, solo tienes que abrir uno de los siguientes archivos (por lo menos) de tu tema:

  • index.php
  • home.php
  • blog.php
  • tag.php
  • archive.php
  • category.php
  • single.php
  • page.php

Abre esos archivos, y cualesquier otro que muestre archivos de entradas de algún modo, y procede a eliminar cualquiera de los siguientes códigos, o similares, si los encuentras:

<?php the_date(); ?>
<?php the_time(); ?>
<?php the_time('F jS, Y') ?>
Published on <?php the_time('F jS, Y') ?>
Publicado el <?php the_time('j F, Y') ?>

Guardas los cambios y ya lo tienes

2. Quitar la fecha de publicación con plugin

Ahora bien, si no tienes aún sobrecargado WordPress de plugins, o tienes un miedo atroz a modificar cualquier archivo de tu tema, siempre puedes instalar el plugin llamado WP post date remover.

Lo mejor de este plugin es que no hay nada que configurar pues ni siquiera tiene página de ajustes, simplemente lo instalas, lo activas y ya está. Además, funciona en muchísimos temas, aún los más actualizados a las últimas versiones de WordPress.

Saluda a tus lectores habituales y a los nuevos

¿A que te gusta que en la cafetería te reconozcan por tu nombre y te preparen el café como te gusta?, pues lo mismo tienes tu que hacer con tus lectores del blog.

Si quieres agradecer a tus lectores habituales la visita y saludarles, y a los nuevos animarles a seguir leyéndote, con algún mensaje personalizado, puedes hacerlo muy fácil.

Y no me refiero a usuarios registrados, que eso ya lo vimos, sino a simples visitantes …

Solo tienes que elegir el lugar del tema en el que colocar este código y personalizarlo un poco a tu gusto:

<?php
if(isset($_COOKIE['comment_author_'.COOKIEHASH])) {
	$lastCommenter = $_COOKIE['comment_author_'.COOKIEHASH];
	echo "¡Bienvenido de nuevo querido lector, espero que disfrutes hoy de mis artículos! ". $lastCommenter ."!";
} else {
	echo "¡Vaya! parece que eres nuevo por aquí, pasa y lee, si no encuentras algo usa el buscador.";
}
?>

Un par de buenos lugares para poner un código así sería antes del loop en index.php y en single.php, por ejemplo, pero tu decides.

Desactivar la comprobación de actualizaciones de plugins

Si tienes una configuración cerrada de WordPress, con una serie de plugins que has modificado o que no quieres que se modifiquen porque, simplemente, funcionan, seguro que no quieres que nadie actualice esos plugins.

Es más, lo ideal sería incluso evitar la comprobación de actualización de los plugins.

Pues nada, solo tienes que añadir este código a tu plugin de funciones o fichero functions.php de tu tema activo:

// Desactivar comprobación de actualización de plugins
remove_action( 'load-update-core.php', 'wp_update_plugins' );
add_filter( 'pre_site_transient_update_plugins', create_function( '$a', "return null;" ) );

Guardas los cambios y ya está, tus plugins seguirán ahí mientras los necesites, sin pedirte actualizaciones. Eso si, ten en cuenta que antes de actualizar WordPress a una versión nueva deberás comprobar si hay versiones nuevas o, al menos, si las versiones actuales de los plugins son compatibles, en caso contrario deberías quitar el código y actualizar los plugins que quieras actualizar.

Por otra parte, si solo quieres no actualizar algún plugin concreto, pues este truco afecta a todos, puedes decidir que algún plugin no se actualice.

Código encontrado en wp snippets

¿Qué tema WordPress usa esa web?

Es una de las preguntas más leídas en los foros WordPress, la que provoca la curiosidad cuando vemos una web que nos gusta y nos preguntamos ¿Qué tema WordPress usa esa web?.

Y, aunque no es fácil siempre adivinar el tema que usa una web, pues en muchas ocasiones se cambian referencias al mismo, si tenemos algunos trucos para tratar de adivinarlo cuando no hay ninguna referencia al tema usado en la misma web, algo bastante común.

1. Ver código fuente

El primer método para adivinar el tema que suelo usar es ver el código fuente de la web en cuestión. Desde el clic derecho de cualquier navegador moderno tenemos acceso a ver el código de la web que estamos visualizando, y una simple búsqueda por la cadena “wp-content/themes/” nos “soplará” el nombre de la carpeta del tema activo en la primera referencia al mismo, que normalmente suele estar en la cabecera del código, en la llamada a la hoja de estilos …

ver tema 2 ver tema 1

2. Inspeccionar elemento de cabecera de hoja de estilos

Un método similar es acceder a la utilidad de inspección de elementos web de los navegadores modernos, o Firebug si usas Firefox, mediante la cual puedes hacer clic en la hoja de estilos y, directamente, ver toda la información de la cabecera de la misma donde, salvo que se haya modificado, tendrás el nombre, descripción y hasta URL de la web del autor del tema.

3. WWTIT

Quizás basado en este método, está el servicio web llamado “What WordPress theme is that?“. Pones la url en la caja de búsqueda y te muestra precisamente esta información de cabecera de la hoja de estilos que todos los temas WordPress usan.

Por supuesto, ninguno de estos métodos anteriores sirve de nada si el administrador o diseñador de la web cambió el nombre de carpeta del tema y la información de cabecera de la hoja de estilos.

4. Clases CSS distintivas

Si este fuera el caso hay alguna cosa que puedes probar. Por ejemplo, usando el método 3 descrito anteriormente, busca una clase CSS exclusiva del tema, que no sea la típica “post” o “content“, sino una con nombres extraños, del gusto de muchos diseñadores.

Una vez identificada una que no sea “corriente” solo tienes que “googlear” por esa clase y, con un poco de suerte, identificar alguna consulta de soporte en foros donde, ya si, se cite el nombre del tema, o incluso la página de soporte del autor.

Y, bueno, esto es lo que yo suelo hacer, si tu tienes algún otro método se agradecerá que lo compartas

Nota: para las capturas he usado la web de mi muy mejor amiga Ana Aldea

Mostrar extractos de páginas inferiores

Seguro que te ha pasado más de una vez, que creas una estructura jerárquica de páginas en la que la página superior o madre en realidad no es más que un texto, que en realidad no lleva a ninguna parte. Por ejemplo, haces una página llamada “Servicios” de la que cuelgan como subpáginas “Diseño” y “Formación“, pero en “Servicios” no hay nada, es una sola estructura de navegación.

Lo que queda fatal es, en estos casos, que alguien haga clic en la página superior y le lleve a una publicación vacía, sin contenido, teniendo que volver a navegar por el menú para acceder a “algo”.

Un modo de evitar este fallo de usabilidad es que el menú no enlace a nada como ya expliqué, pero si queremos darle una vuelta de tuerca y ofrece algo ¿qué mejor que un listado de las subpáginas, con un extracto que muestre su contenido?.

Para conseguirlo debes editar el loop del archivo ‘page.php‘ de tu tema con este código:

<? $pageChildren = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_parent = ".$post->ID." AND post_type = 'page' ORDER BY menu_order", 'OBJECT'); ?>
<? if ( $pageChildren ) : foreach ( $pageChildren as $pageChild ) : setup_postdata( $pageChild ); ?>
<!-- loop stuff here -->
<? endforeach; endif; ?>

Pero si tienes páginas que si tengan contenido entonces tendrías que añadirle un condicional más para que no muestre títulos y extractos de subpáginas en ese caso, de este modo:

<? if (is_page('3')) { } else { // if its page 3 then show nothing ?>
<? $pageChildren = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_parent = ".$post->ID." AND post_type = 'page' ORDER BY menu_order", 'OBJECT'); ?>
<? if ( $pageChildren ) : foreach ( $pageChildren as $pageChild ) : setup_postdata( $pageChild ); ?>
<!-- loop stuff here -->
<? endforeach; endif; } ?>

Ahora bien, la opción más segura será siempre crear una plantilla de página personalizada cuyo loop tenga el primer código y elijas esa plantilla para tus páginas “madre”.

Estupendo truco de The WordPress Guru

Tu propio widget de noticias en el escritorio en WordPress

ultimas noticias wordpress

¿Te has fijado en que algunos plugins añaden un widget de noticias propio en el escritorio?, ¿te gustaría saber hacerlo?, pues la verdad es que es bastante sencillo, como casi todo en WordPress.

Es un elemento de branding estupendo para fidelizar clientes o simplemente para tener informados a tus usuarios registrados.

Solo hay que recurrir a nuestro ya célebre plugin de funciones, o sino al fichero functions.php del tema activo y añadir lo siguiente:

// Widget de Escritorio personalizado
add_action('wp_dashboard_setup', 'my_dashboard_widgets');
function my_dashboard_widgets() {
     global $wp_meta_boxes;
     // quita widgets innecesarios, y principalmente los widgets de noticias, pues ya está el tuyo
     // var_dump( $wp_meta_boxes['dashboard'] ); // se usa para obtener todos los ID de los widgets
     unset(
          $wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins'],
          $wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary'],
          $wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']
     );
     // añade el widget propio de escritorio
     wp_add_dashboard_widget( 'dashboard_custom_feed', 'Lo último sobre WordPress', 'dashboard_custom_feed_output' ); //añade una nueva fuente RSS
}
function dashboard_custom_feed_output() {
     echo '<div class="rss-widget">';
     wp_widget_rss_output(array(
          'url' => 'http://feeds.feedburner.com/AyudaWordPress',
          'title' => 'Lo último sobre WordPress',
          'items' => 3,
          'show_summary' => 1,
          'show_author' => 0,
          'show_date' => 1
     ));
     echo "</div>";
}

Queda así de chulo …

Cómo no, lo tendrás que personalizar, cambiando la “url” por el feed RSS que quieras, los “items” al número de entradas que mostrará por defecto, si quieres mostrar un extracto de cada entrada (“summary“), el autor (“author“) o la fecha (“date“), y por supuesto el título que aparecerá en la lista de widgets disponibles y también en el del Widget.

Ah, en el código, por defecto se anulan los demás widgets de noticias, para que solo esté disponible el tuyo. Si quieres eliminas las líneas relativas al “unset”.

Espero que te guste, yo lo uso siempre para todos los desarrollos de clientes, es muy agradecido.

Paginación en WordPress sin plugin

Ya sé que la mayoría de los que me leéis sois adictos a Pagenavi, ese maravilloso y bien construido plugin que ofrece paginación a nuestro WordPress de manera sencilla.

Pero ¿se puede añadir paginación sin instalar plugins? …

Pues claro, igual que añadimos paginación de comentarios sin plugin podemos añadir paginación a nuestra web sin usar Pagenavi o algún otro plugin, solo hay que usar una función interna de WordPress que lleva ahí desde la versión 2.1, paginate_links y sus posibles parámetros.

El código que nos ofrecerá esta maravilla es el siguiente:

// obtenemos el total de páginas
global $wp_query;
$total = $wp_query->max_num_pages;
// solo seguimos con el resto si tenemos más de una página
if ( $total > 1 )  {
     // obtenemos la página actual
     if ( !$current_page = get_query_var('paged') )
          $current_page = 1;
     // la estructura de “format” depende de si usamos enlaces permanentes "humanos"
     $format = empty( get_option('permalink_structure') ) ? '&page=%#%' : 'page/%#%/';
     echo paginate_links(array(
          'base' => get_pagenum_link(1) . '%_%',
          'format' => $format,
          'current' => $current_page,
          'prev_next' => True,
          'prev_text' => __('&laquo; Anterior'),
          'next_text' => __('Siguiente &raquo;'),
          'total' => $total,
          'mid_size' => 4,
          'type' => 'list'
     ));
}

La explicación de lo que hacen los distintos parámetros es la siguiente:

  • base
    Esta es la ruta de los enlaces de número de página, sin incluir la parte específica de paginación de la URL. Los caractes %_% se sustituirán en esa URL para la pa rte específica de la página de la URL.
  • format
    Esta es la parte de la “página” de la URL. %#% se sustituye pro el número de página.. Por ejemplo, page/%#% o ?page=%#%.
  • total
    El numéro total de páginas disponibles.
  • current
    El número de la página actual.
  • show_all
    Lista todos los enlaces a páginas en vez de limitarlo a un cierto número de enlaces a izquierda o derecha de la página actual..
  • prev_next
    Incluye los enlaces a “Anterior” y “Siguiente” (si procede), como harías normalmente con la función previous_posts_link(). Solo funcionará si también ponemos previamente la función prev_next en “True”.
  • prev_text y next_text
    Texto que irá dentro de los enlaces “Anterior” y “Siguiente”.
  • end_size
    El número de enlaces a páginas a mostrar al final. Por defecto está a 1 (por ejemplo: 1 2 3 … 10).
  • mid_size­
    El número de páginas a mostrar en cada lado de la página actual. Por defecto está puesto a 2 (ejemplo: 1 … 3 4 5 6 7 … 10).
  • type
    Te permite especificar el estilo de salida. Por defecto es “plain”, o sea, una lista de enlaces. También puede establecerse a formatos de “list” (o sea, enlaces englobados en ul y li) o de “array” (lo que mostrará una selección de enlaces a páginas que pueden definirse como tu quieras).
  • También puedes añadir argumentos y fragmentos de query, a tu gusto.

El código del ejemplo generará un HTML como este:

<ul class='page-numbers'>
     <li><span class='page-numbers current'>1</span></li>
     <li><a class='page-numbers' href='http://miwordpress.com/page/2/'>2</a></li>
     <li><a class='page-numbers' href='http://miwordpress.com/page/3/'>3</a></li>
     <li><a class='page-numbers' href='http://miwordpress.com/page/4/'>4</a></li>
     <li><a class='page-numbers' href='http://miwordpress.com/page/5/'>5</a></li>
     <li><span class='page-numbers dots'>...</span></li>
     <li><a class='page-numbers' href='http://miwordpress.com/page/10/'>10</a></li>
     <li><a class='next page-numbers' href='http://miwordpress.com/page/2/'>Next &raquo;</a></li>
</ul>

Una vez tengas el código a tu gusto solo tienes que incluirlo – preferentemente – en las primeras líneas del archivo footer.php de tu tema activo.

Controlar automáticamente el ancho de imágenes en las entradas

Pasa bastante a menudo, que insertamos imágenes y superan el ancho de nuestro tema WordPress. Por supuesto, podemos ajustar la imagen manualmente en el editor, modificando el ancho visible.

Pero ¿no te gustaría algo como lo que hace el tema por defecto TwentyEleven?. Si, esa cosa que hace que siempre se ajusten las imágenes al tema sin necesidad de tocar nada al insertarla en nuestra entrada.

Pues es muy fácil, solo hay que añadir unas líneas de código en la hoja de estilos del tema, normalmente un archivo llamado style.css.

Para ello, lo primero es buscar en la hoja de estilos la clase que define las imágenes, normalmente algo acompañado de img. Una vez localizado solo hay que añadir lo siguiente a esa clase:

max-width: 565px;
width: expression(this.width > 565 ? 565: true);

En este caso he adaptado el ancho máximo al de mi tema (565 pixels), que es el único parámetro que deberás modificar para que se adapte al tuyo.

Este truco puedes usarlo en tu WordPress alojado o en WordPres.com si adquiriste la actualización de diseño, con la que puedes modificar la hoja de estilos.

Este bonito truco se lo leí a Lorenzo Solís.