Seguridad y consejos para instalar WordPress

Debido a la popularidad de WordPress, los sitios web que utilizan esta plataforma se convierten en objetivo de muchos hackers. Es nuestro deber hacer uso de WordPress con cierta responsabilidad y precaución ya que un sitio web vulnerable puede perjudicar a miles de usuarios que lo visitan.

He publicado un artículo en el blog de digiworks.es donde explico algunas de las buenas prácticas para instalar WordPress de una forma más segura.
También doy algunos consejos básicos para la seguridad y para entender mejor la importancia de la misma encontrarás un breve repaso de los ataques más habituales cuando hablamos de WordPress.

Puedes ver el artículo completo desde el siguiente enlace:
http://www.digiworks.es/blog/2015/01/15/seguridad-en-wordpress-y-algunos-consejos-para-la-instalacion/

Plugins gratuitos, dónde buscar y cómo elegir

Podemos estar casi seguros de que cualquier plugin que descarguemos del repositorio de wordpress.org estará libre de código malicioso y malas intenciones, ya que todos los plugins subidos a este repositorio son probados y revisados por un equipo de expertos que realizan esta tarea de forma voluntaria. Pero no siempre podemos fiarnos de la calidad del código.

Recientemente he publicado un artículo en el blog de digiworks.es donde doy unos consejos y recomendaciones sobre los criterios a seguir para elegir correctamente un plugin gratuito.

Si te interesa este tema puedes visitar el artículo completo en el siguiente enlace:
http://www.digiworks.es/blog/2015/01/13/plugins-gratuitos-para-wordpress-donde-buscar-y-como-elegir/

Cuando usar template_redirect y template_include

¿ Cuando deberíamos usar template_redirect y cuando deberíamos usar template_include ?

Echando un ojo al codex de wordpress.org podemos leer claramente en que situaciones debemos usar una u otra función, pero a pesar de tener esto plasmado en la documentación a veces puede resultar confuso.

template_redirect

Este hook se ejecuta justo antes de que WordPress determine que template debe usar. Es decir,  que cuando se ejecuta WordPress ya ha hecho las consultas principales necesarias e instanciado todos los objetos, todo esta hecho excepto el “output”.

Es el punto ideal para redirigir al usuario a otro lugar queriendo tener conocimiento del contenido.

No es una buena práctica usar este hook para incluir una plantilla distinta.

Supongamos que usamos template_redirect para incluir una plantilla:

1
2
3
4
5
6
7
8
add_action( 'template_redirect', 'switch_template' );
 
function switch_template() {
  if ( is_page('test') ) {
    include( PATH . '/test-file.php' );
    exit();
  }
}

El problema aquí es que cualquier script que venga después de este código no va a ejecutarse.

La manera correcta de hacer esto sería usando template_include.

template_include

Este hook se ejecuta justo antes de que WordPress incluya el archivo del template.

Con el ejemplo de antes, la manera correcta sería:

1
2
3
4
5
6
7
8
9
10
11
12
add_filter( 'template_include', 'switch_template' );
 
function switch_template( $template ) {
  if ( is_page('test') ) {
    $template_test = locate_template( array( 'test-file.php' ) );
    if ( $template_test != '' ) {
	   return $template_test ;
	}
  } else {
    return $template;
  }
}

¿ Entonces cuándo podríamos usar template_redirect ?
Un buen ejemplo és el que esta en el codex de wordpress.org, cuando llegamos a una determinada página y queremos que el usuario este identificado, si no esta identificado se le redirige a la pagina de registro.
El siguiente código es el que se encuentra en ese mismo ejemplo:

function my_page_template_redirect()
{
    if( is_page( 'goodies' ) && ! is_user_logged_in() )
    {
        wp_redirect( home_url( '/signup/' ) );
        exit();
    }
}
add_action( 'template_redirect', 'my_page_template_redirect' );

Conclusión

Simplemente hay que tener en cuenta que tal y como indican sus respectivos nombres:

Renombra el prefijo de tablas en un WordPress existente

Sigue estos pocos pasos para renombrar el prefijo de las tablas de tu web WordPress existente.

Edita wp-config.php y cambia

$table_prefix = 'wp_';

por otro prefijo cualquiera, intenta que sea algo abstracto y difícil de adivinar por cualquiera, por ejemplo:

$table_prefix = 'v5r33w67ee_';

Renombra las tablas en tu base de datos, las sentencias SQL para renombrar las tablas son las siguientes:

RENAME table `wp_users` TO `v5r33w67ee_users`;
RENAME table `wp_usermeta` TO `v5r33w67ee_usermeta`;
RENAME table `wp_comments` TO `v5r33w67ee_comments`;
RENAME table `wp_commentmeta` TO `v5r33w67ee_commentmeta`;
RENAME table `wp_links` TO `v5r33w67ee_links`;
RENAME table `wp_options` TO `v5r33w67ee_options`;
RENAME table `wp_posts` TO `v5r33w67ee_posts`;
RENAME table `wp_postmeta` TO `v5r33w67ee_postmeta`;
RENAME table `wp_terms` TO `v5r33w67ee_terms`;
RENAME table `wp_term_taxonomy` TO `v5r33w67ee_term_taxonomy`;
RENAME table `wp_term_relationships` TO `v5r33w67ee_term_relationships`;

Añade las sentencias que haga falta para renombrar el resto de tablas que puedas tener de otros plugins o themes.
También puedes renombrar las tablas desde phpMyAdmin a través de la pestaña Operaciones.

Por último, actualiza las referncias al prefijo antiguo que se encuentran en las tablas usermeta y options, usando estas sentencias SQL:

UPDATE `v5r33w67ee_usermeta` SET `meta_key` = REPLACE( `meta_key`, 'wp_', 'v5r33w67ee_' );
UPDATE `v5r33w67ee_options` SET `option_name` = 'v5r33w67ee_user_roles' WHERE `option_name` = 'wp_user_roles';

Reparar base de datos corrupta

Si la base de datos esta corrupta probablemente el usuario no pueda identificarse a través del login. Puedes ejecutar un script que se encuentra en http://tu_dominio/wp-admin/maint/repair.php, este script puede ejecutarse sin necesidad de que el usuario inicie sesión. Pero antes de ejecutar el script debes añadir la siguente línea en el archivo wp-config.php:

define( 'WP_ALLOW_REPAIR', true );

NOTA: No olvides eliminar esta línea después de reparar la base de datos.

Algunas líneas de configuración, wp-config.php

Configura WordPress para que vacie la papelera automáticamente después de un número concreto de días.

define( 'EMPTY_TRASH_DAYS', 30 );

Cambia el intervalo de tiempo del autoguardado de entradas, páginas, etc.
Ajusta los segundos que te gustaría que tu contenido se autoguardara mientras editas.

define( 'AUTOSAVE_INTERVAL', 160 );

Limita el número de revisiones. O desactiva la opción dando el valor false.

define( 'WP_POST_REVISIONS', 3 );

Activa el modo Debug sin mostrarlo en tus páginas. Esta combinación de líneas guardará el log de errores en el archivo debug.log dentro de la carpeta wp-content/.

define('WP_DEBUG', true);
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', true);

Las siguientes líenas ya estan en el archivo wp-config.php, y siempre se debe cambiar el valor que viene por defecto.
Una manera de hacerlo es visitando la página https://api.wordpress.org/secret-key/1.1/salt/ y reemplazar los valores por defecto por los que se aparecen en el enlace.

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

Activa la función multisite.

define( 'WP_ALLOW_MULTISITE', true );

Definir la URL del sitio web.

define('WP_HOME', 'http://www.wptips.me');
define('WP_SITEURL', 'http://www.wptis.me');

Sobreescribir los permisos de archivos.

define('FS_CHMOD_FILE', 0755);
define('FS_CHMOD_DIR', 0644);

Puedes configurar la Optimización Automática de la Base de datos. Si la base de datos esta corrupta es probable que el usuario no pueda identificarse a través de su login, así que para ejecutar este script el usuario no necesita iniciar sesión. Es recomendable eliminar esta línea de código tras haber reparado la base de datos.
Tras incluir esta línea en wp-config.php, el script a ejecutar se encuentra en http://tu_dominio/wp-admin/maint/repair.php

define( 'WP_ALLOW_REPAIR', true );

Puedes incrementar la memoria PHP (no funcionará con todos los hostings).

define('WP_MEMORY_LIMIT', '64M');

Define tablas customizadas para los usuarios:

define('CUSTOM_USER_TABLE', $table_prefix.'custom_users');
define('CUSTOM_USER_META_TABLE', $table_prefix.'custom_usermeta');

Desactiva el editor de plugins y themes del panel de administración:

define( 'DISALLOW_FILE_EDIT', true );

Cambia el nombre y ruta del directorio wp-content.

define( 'WP_CONTENT_DIR', dirname(__FILE__)  . '/some-folder/site-content' );
define( 'WP_CONTENT_URL', 'http://' . $_SERVER['HTTP_HOST'] .  '/some-folder/site-content';

Y no olvides proteger el archivo wp-config.php a través del archivo .htaccess.

1
2
3
4
<Files wp-config.php>
    order allow,deny
    deny from all
</Files>

Para uso más avanzado de wp-config.php visita http://codex.wordpress.org/Editing_wp-config.php

Editor visual en blanco y sin botones.

¿Alguna vez has entrado en tu admin para añadir un post y te has encontrado con el editor visual en blanco y sin botones?

Me encontré con este problema no hace mucho, quise editar un post, mi editor visual estaba en blanco y los botones del mismo no aparecían, pero el post en sí aparecía correctamente en la parte pública de la web.

En mi caso a través del firebug (un add-on para depurar) pude ver que el error se trataba de un archivo .js que no se encontraba, concretamente era un archivo del tinymce, por alguna razón había desaparcido. Así que sólo tuve que volver a subir el archivo y el problema estaba arreglado.

Para arreglar este tipo de problema se pueden probar una serie de pasos.

1. Vaciar el Cache de tu navegador.

Si sigues sin ver correctamente el editor:

2. Volver a subir los archivos del tinymce, es decir sobreescribir la carpeta /wp-includes/js/tinymce/

Vuelve a vaciar el cache por si las moscas….
Y si el problema persiste:

3. Edita wp-config.php

Pon esta línea de código arriba del todo de tu archivo wp-config.php justo después de la apertura de php (<?php):

define('CONCATENATE_SCRIPTS', false);

Y a ver si hay suerte!

Plugin “Duplicate Menu”

Este es un plugin simple pero muy útil que nos ayudará a ahorrar mucho tiempo.

Con este plugin, como ya has podido adivinar por el nombre, puedes duplicar un menú para añadirlo en cualquier otro sitio de tu web,

Imagina que tienes una navegación principal bastante grande (o no tan grande)  y te gustaría añadir la misma navegación en el footer de tu página. Con este plugin podrás hacer esto con tan sólo unos cuantos clicks, sino tendrías que crear el menú manualmente y añadir tus páginas (o lo que quisieras añadir) una por una. Así que con este plugin vas a ahorrar muchísimo tiempo.

Puedes encontrarlo en el repositorio de wordpress.org  http://wordpress.org/plugins/duplicate-menu/

Después de instalarlo dirígete a  Apariencia -> Duplicate menu.

duplicate-menu-1

Duplica tu menú y después ves a Apariencia -> Menús, y podrás ver tu nuevo menú en la lista.

duplicate-menu-2