Seguridad en WordPress, htaccess, wp-config y functions, top 10 consejos

post - - leave a reply - share
seguridad-en-wordpress

1. Tu equipo y tu conexión segura antes que la seguridad en WordPress

  • Parece obvio, pero no lo es tanto. Esto es lo primero antes de meternos con la seguridad en WordPress.
  • Usa sFTP.
  • Accede al panel de administración de tu WordPress, únicamente desde tu conexión y equipo habitual (entendiendo que ambos son completamente seguros).

2. Backups

Realizar copias periódicas de seguridad tanto de los ficheros como de la base de datos de nuestro WordPress.

3. WordPress

  • Descargar WordPress de su web oficial: http://wordpress.org
  • Siempre actualizar WordPress tras la salida de una nueva versión.

4. Plugins

  • Ser conscientes de que los plugins son códigos realizados por terceros programadores.
  • Usar los plugins estrictamente necesarios y de total confianza para nuestro proyecto.
  • Solo descargar del sitio oficial: http://wordpress.org/plugins/.
  • Tener las últimas versiones de los plugins almacenado en nuestro WordPress (esten activos o no).
  • Quitar del servidor todos los plugins que no usemos.
  • Saber que cuanto más plugins, más vulnerabilidad y menor escalabilidad tendremos.

Hay solo un plugin que si consideraría implementar para la seguridad en WordPress:

  • Better WordPress Security: Asegura tu WordPress en pocos minutos. Chequea, recomienda y facilita la configuración más segura.

5. Themes

  • Usar un buen theme, bien programado y de confianza.
  • Tener las últimas versiones de los themes almacenado en nuestro WordPress (esten activos o no).
  • Solo usamos un theme, quitar del servidor el resto.

6. Ficheros y permisos

7. Base de datos

  • Cambiar el prefijo por defecto de WordPress para las tablas “wp_” por uno más complejo.

8. Editar htaccess, wp-config.php y functions.php

.htaccess

A continuación he reunido algunos códigos para evitar posibles puntos flojos de seguridad y protegernos más del spam.
Sustituir *yourdomain.com.* por nuestro dominio en el código del apartado “# For AntiSpam Deny Access to No Referrer Requests”.
Estos códigos deben incorporarse al fichero .htaccess del directorio raíz de nuestra instalación de WordPress.

# BEGIN SECURE
# Block Sensitive Files from Browser 
Options All -Indexes
<files .htaccess>
Order allow,deny
Deny from all
</files>
<files wp-config.php>
Order allow,deny
Deny from all
</files>
<files error_log>
Order allow,deny
Deny from all
</files>

# Block the include-only files.
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]

# Disable the Server Signature 
ServerSignature Off

# For AntiSpam Deny Access to No Referrer Requests 
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.*yourdomain.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) http://%{REMOTE_ADDR}/$ [R=301,L]
# END SECURE

wp-config.php

Usar claves secretas y únicas de autenticación:

  1. Puedes generar las claves de forma aleatoria a través de la API de WordPress.
  2. Una vez generadas ponlas en tu fichero wp-config.php.
  3. Puedes cambiar las claves en cualquier momento para invalidar todas las cookies existentes. Esto forzará a todos los usuarios a volver a hacer login.

Desactivar la opción de editar ficheros desde wp-admin:

define('DISALLOW_FILE_EDIT', true);

Forzando el login seguro con SSL:

define('FORCE_SSL_ADMIN', true);

functions.php

Eliminar la versión de WordPress:

function wpsecure_remove_version() { return ''; }
add_filter('the_generator', 'wpsecure_remove_version');

9. Usuarios registrados

Super admin y administradores

  • Cambiar el usuario por defecto de WordPress admin por otro username más complejo.
  • Un solo administrador es más que suficiente.
  • El admin en especial debe tener una contraseña compleja. Por ejemplo 20 caracteres que incorpore números, letras y signos.

Resto de usuarios

  • Revisar los roles de usuarios en WordPress.
  • No todos tienen que ser “editores”, probablemente puedan ser “autores”.
  • El product manager o coordinador si podría tener el rol de “editor”.
  • ¿Realmente necesitas usuarios anónimos “suscriptores” de tu WordPress?. Si no es así fuera con ellos, quien quiera suscribirse lo hará por feed con programas a tal efecto como feedly.
  • Ojo con activar la opción para permitir el registro de usuarios anónimos que se encuentra en wp-admin > ajustes > general.

10. Comentarios y Spam

La mayoría de opciones a tratar en: wp-admin > ajustes > comentarios

  • Obligatorio activar la opción de rellenar nombre y email para comentar.
  • Obligatorio usar un plugin antispam como akismet.
  • Obligatorio incluir en la blacklist palabras típicas de spam.
  • Preferible marcar la opción para que un administrador apruebe el comentario antes de ser publicado.
  • También podemos usar un sistema de comentarios externo como DISQUS, más seguro y dinamizador.

Referencias para la seguridad en WordPress

Desactivar el editor visual en WordPress

post - - leave a reply - share
disablevisualeditor

Si queremos que los editores del blog usen únicamente el editor de texto (html) y no el visual, podemos ir a wp-admin > usuarios > perfil y activar o desactivar la opción de enriquecer el editor.

Pero si lo que queremos es desactivar el editor visual solo para determinados casos y de forma dinámica, la cosa se complica un poquito más, no obstante WordPress tiene un core y funciones para hacer todo lo que se te ocurra 😛

Vamos con un ejemplo, supongamos que la idea es desactivar el editorial visual solamente para las entradas de tipo (páginas) y solamente las que fueron creadas por el usuario administrador (que es el que tiene ID = 1).

En functions.php:

add_action('init', 'remove_editor_init');
function remove_editor_init() {
    $post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'];
    $post = get_post($post_id); 
    $type = $post->post_type;
    if ($type == "page" && get_post_field(post_author, $post_id) == 1) {
        add_filter('user_can_richedit' , '__return_false', 50 );
    }
}

Eliminando el style por defecto de una gallery con un add_filter en WordPress

post - - 2 replies - share

Cuando insertamos una galería de imágenes en WordPress se incrusta por defecto una serie de estilos CSS:

#{$selector} {
margin: auto;
}
#{$selector} .gallery-item {
float: {$float};
margin-top: 10px;
text-align: center;
    	width: {$itemwidth}%;
    }
    #{$selector} img {
    	border: 2px solid #cfcfcf;
    }
    #{$selector} .gallery-caption {
    	margin-left: 0;
    }

Este fragmento de código se encuentra en:
wp-includes/media.php (Line 833)

El problema es que se incrusta estilo en pleno documento, donde se ha insertado la galería. Lo cual no resulta muy limpio si atendemos a la abstracción de las 3 capas: diseño, función y contenido.

Si volvemos a media.php veremos entorno a la línea 831:

if ( apply_filters( 'use_default_gallery_style', true ) )

Por tanto una opción elegante podría ser:

add_filter('use_default_gallery_style', FALSE);

Colocando este filtro en el fichero functions.php del theme usado, indicamos a WordPress que no debe usar por el estilo CSS por defecto para las galerías, y relegamos el CSS necesario al fichero style.css donde tengamos centralizado todo el estilo del blog.

Usando filtros se puede cambiar altamente el comportamiento por defecto de WordPress.

Variables en CSS; Implementaciones

post - - 3 replies - share

Es seguro que en algún momento todos los que trabajamos con CSS echamos en falta las conocidas variables, elementos esenciales en cualquier lenguaje de programación. Para solventarlo se me ocurren varias formas:

  • Evitar las redundancias.
  • Usar mejor la descendencia en los selectores.
  • Definir las variables como meros comentarios.
  • Usar variables de PHP u otro lenguaje dinámico de servidor.
  • Decantarnos por CSS 3.

Es probable que existan más formas ¿conoces alguna?, bueno… de momento voy a intentar explicar las mencionadas.

Read more

Actualizar CSS evitando cache del usuario

post - - 5 replies - share

En un momento dado podemos detectar varias mejora consecutivas en nuestro CSS. Las editamos y las subimos, luego refrescamos el navegador con la página y ya esta todo correcto.

Pero puede pasar que el usuario tenga su navegador configurado de una forma determinada, no realice ese refresco de página, y tenga el CSS almacenado en la memoria cache, por tanto seguirá viendo la página exactamente igual.

Read more

Fundamentos web 2008

post - - 2 replies - share

Cartel de fundamentos web 2008Recientemente he asistido al congreso fundamentos web 2008, en Gijón (Asturias).

Se trata de un evento organizado por la Fundación CTIC, la oficina española del consorcio W3C, y subvencionado por el Gobierno del Principado de Asturias.

Este evento ha conseguido tras varias ediciones una enorme relevancia internacional, incorporando en sus actos a ponentes de primera fila.

A continuación voy a destacar lo que me ha parecido más interesante.

Read more

Migrar de php4 a php5

post - - 4 replies - share

Días atrás me encontré ante la tediosa tarea de migrar una aplicación (bastante grande) programada en php4 a un servidor bajo php5. Voy a exponer en este post algunas de las diferencias encontradas y que pueden ahorrar algún dolor de cabeza 😉

Read more