Asegurar/optimizar tu sitio WordPress

WordPress es sin duda el mejor CMS para gestión de contenido en sitios web. No importa si tu sitio es un blog personal, tu portafolio de presentación o un sitio web complejo, WordPress es la mejor opción para gestionarlo.

Según estudios recientes, WordPress acapara el 58.55% de todos los sitios que utilizan algún CMS y el 27% de todos los sitios en Internet utilizan WordPress.

Intentaré no perderme durante tanto tiempo y brindar con alguna frecuencia tips útiles para tu sitio WordPress.

WordPress y .htaccess

El archivo .htaccess (hypertext access) es un archivo de configuración muy popular en servidores web basados en Apache que permite a los administradores aplicar distintas políticas de acceso a directorios o archivos con la idea de mejorar la seguridad de su página web y, por tanto, evitar acceso a terceros. Cuando visitamos una página web cualquiera y pulsamos sobre un enlace o queremos descargarnos un archivo, en el proceso de trámite de la petición, el servidor web consulta el archivo .htaccess con la idea de aplicar las directivas y restricciones definidas antes de cursar la petición y, lógicamente, cancelar peticiones que se encuentren prohibidas dentro de este archivo (cuyo ámbito de actuación es el directorio en el que se encuentra y todos los subdirectorios que se encuentran por debajo de éste).

El archivo se llama .htaccess y lleva un punto al inicio. En ambientes Unix/Linux donde normalmente se encuentra instalado el servidor web Apache, el punto al inicio del nombre del archivo indica que el mismo será un archivo oculto, es decir, no podrá ser, por ejemplo, consultado desde Internet por un navegador.

WordPress usa este archivo para manipular cómo Apache sirve los archivos desde su directorio raíz y sus subdirectorios. En particular, WordPress modifica este archivo para poder manejar los permalinks.

No existe el archivo .htaccess perfecto, algunos dan un enfoque a la seguridad mientras otros se enfocan más en mejorar el desempeño del sitio. Yo por mi parte, he creado el mío propio que creo tiene un balance entre ambas.

.htaccess básico para WordPress

Cuando instalamos WP, este configura un archivo .htaccess básico, el cual contiene las siguientes instrucciones:

1
2
3
4
5
6
7
8
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

Supongamos ahora que instalamos nuestro WordPress para nuestro sitio sin especificar la utilización de https, es decir, no estamos brindando seguridad a nuestros visitantes. Podemos forzar que el sitio sea desplegado en https reemplazando nuestro archivo .htaccess por el siguiente:

1
2
3
4
5
6
7
8
9
10
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

La utilización de estas útlimas instrucciones, implican dos cosas:

  1. Contamos con un certificado de seguridad válido (no autofirmado) para nuestro sitio web.
  2. Estamos seguros que todos los elementos de nuestro sitio que son llamados mediante URLs absolutas utilizan https en la dirección, de lo contrario, obtendremos un mensaje de advertencia en el navegador por contenido mixto (contenido que utiliza http en el URL cuando el sitio está siendo llamado sobre https).

Secure .htaccess

Existen ciertas secciones en nuestra instalación WP que debemos proteger. Además, es importante auxiliarnos del caché del navegador para optimizar el desempeño del sitio web y obtener un mejor rendimiento mientras disminuimos las solicitudes al servidor.

Para conseguir todo esto, podemos utilizar el siguiente archivo .htaccess. Como siempre, este es un trabajo en desarrollo y puede mejorarse.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# Protect config, ini and log files (this also includes wp-config.php etc)
  <filesmatch "^(wp-config\.php|php\.ini|php5\.ini|install\.php|php\.info|readme\.html|bb-config\.php|\.htaccess|\.htpasswd|readme\.txt|timthumb\.php|error_log|error\.log|PHP_errors\.log|\.svn)">
  Deny from all
</filesmatch>

# Disable directory listing throughout your WordPress
Options All -Indexes

# Block an IP or range of IPs
order allow,deny
# deny from 172.16.130.106 (remover # y agregar IP a bloquear
allow from all

# Block Bad bots
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^evilbot [OR]
RewriteCond %{HTTP_USER_AGENT} ^spambot [OR]
RewriteCond %{HTTP_USER_AGENT} ^virusbot [OR]
RewriteCond %{HTTP_USER_AGENT} ^YandexBot [OR]
RewriteCond %{HTTP_USER_AGENT} ^yandexbot
RewriteRule ^(.*)$ http://no.access/

# Prevent websites from hotlinking to your WordPress
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?www.yourwebsite.com [NC] ## &lt; &lt;&lt;&lt; CHANGE URL ##
# Match all files with the below list of extensions
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

# Leverage browser caching ##

ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType application/x-javascript "access 1 month"
ExpiresByType application/javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"

# BEGIN WordPress (https redirect)

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# Block access to wp-login.php

order deny,allow
Deny from all
# whitelist IP address
allow from 103.101.196.1 # (reemplazar por nuestra dirección IP)

Leave a Reply

Your email address will not be published. Required fields are marked *