Seguridad en WordPress mediante el archivo htaccess

Wordpress es sin duda el CMS por excelencia y por ello también es el CMS mas atacado por los hackers, bien sea para demostrar los agujeros de seguridad o bien sea por caciquismo radical, sea por el motivo que sea hoy hemos querido recopilar unas cuantas maneras de darle mas seguridad a nuestro WordPress mediante el archivo .htaccess

La primera de ellas va dirigida directamente a la carpeta “uploads”, esta carpeta es extremadamente sensible ya que debe tener permisos de escritura para que nosotros o nuestros editores puedan subir los archivos que se comparten en los artículos escritos.

Así los posibles atacantes saben que pueden subir a dicha carpeta los archivos que después pueden atacar a nuestro sistema, para intentar evitar esto crearemos un archivo .htaccess en nuestra carpeta “uploads” con las siguientes lineas de código.

# capar archivos en uploads
<Files ~ ".*\..*">
Order Allow,Deny
Deny from all
</Files>
<FilesMatch "\.(jpg|jpeg|jpe|gif|png|bmp|pdf|rtf|xls|numbers|odt|zip|rar)$">
Order Deny,Allow
Allow from all
</FilesMatch>

Como podéis ver aquí lo que hacemos es darle solo permisos a ciertos archivos, lógicamente podemos personalizar el código a nuestras necesidades añadiendo o quitando formatos de subida.

Otra opción elegida por los atacantes es ir directamente a por el archivo wp-config.php, muchas veces las infecciones de nuestro WordPress vienen por código inyectado directamente en este archivo, también podemos evitar intrusiones indeseadas tan solo añadiendo el siguiente código en el archivo .htaccess.

<Files wp-config.php>
order allow,deny
deny from all
</Files>

Y por ultimo en perishablepress.com encontramos unas reglas para añadir a nuestro archivo .htaccess que impiden multitud de solicitudes de posibles atacantes manteniendo nuestro sitio a salvo de indeseables.

# 5G BLACKLIST/FIREWALL
# @ http://perishablepress.com/5g-blacklist/
# 5G:[QUERY STRINGS]
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} (environ|localhost|mosconfig|scanner) [NC,OR]
RewriteCond %{QUERY_STRING} (menu|mod|path|tag)\=\.?/? [NC,OR]
RewriteCond %{QUERY_STRING} boot\.ini [NC,OR]
RewriteCond %{QUERY_STRING} echo.*kae [NC,OR]
RewriteCond %{QUERY_STRING} etc/passwd [NC,OR]
RewriteCond %{QUERY_STRING} \=\\%27$ [NC,OR]
RewriteCond %{QUERY_STRING} \=\\\'$ [NC,OR]
RewriteCond %{QUERY_STRING} \.\./ [NC,OR]
RewriteCond %{QUERY_STRING} \? [NC,OR]
RewriteCond %{QUERY_STRING} \: [NC,OR]
RewriteCond %{QUERY_STRING} \[ [NC,OR]
RewriteCond %{QUERY_STRING} \] [NC]
RewriteRule .* - [F]
</ifModule>
# 5G:[USER AGENTS]
<ifModule mod_setenvif.c>
SetEnvIfNoCase User-Agent ^$ keep_out
SetEnvIfNoCase User-Agent (casper|cmsworldmap|diavol|dotbot) keep_out
SetEnvIfNoCase User-Agent (flicky|ia_archiver|jakarta|kmccrew) keep_out
SetEnvIfNoCase User-Agent (libwww|planetwork|pycurl|skygrid) keep_out
SetEnvIfNoCase User-Agent (purebot|comodo|feedfinder|turnit) keep_out
SetEnvIfNoCase User-Agent (zmeu|nutch|vikspider|binlar|sucker) keep_out
<limit GET POST PUT>
Order Allow,Deny
Allow from all
Deny from env=keep_out
</limit>
</ifModule>
# 5G:[REQUEST STRINGS]
<ifModule mod_alias.c>
RedirectMatch 403 (https?|ftp|php)\://
RedirectMatch 403 /(cgi|https?|ima|ucp)/
RedirectMatch 403 /(Permanent|Better)$
RedirectMatch 403 (\=\\\'|\=\\%27|/\\\'/?|\)\.css\()$
RedirectMatch 403 (\,|//|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\||\\\"\\\")
RedirectMatch 403 \.(cgi|asp|aspx|cfg|dll|exe|jsp|mdb|sql|ini|rar)$
RedirectMatch 403 /(contac|fpw|install|pingserver|register)\.php$
RedirectMatch 403 (base64|crossdomain|localhost|wwwroot|e107\_)
RedirectMatch 403 (eval\(|\_vti\_|\(null\)|echo.*kae|config\.xml)
RedirectMatch 403 \.well\-known/host\-meta
RedirectMatch 403 /function\.array\-rand
RedirectMatch 403 \)\;\$\(this\)\.html\(
RedirectMatch 403 proc/self/environ
RedirectMatch 403 msnbot\.htm\)\.\_
RedirectMatch 403 /ref\.outcontrol
RedirectMatch 403 com\_cropimage
RedirectMatch 403 indonesia\.htm
RedirectMatch 403 \{\$itemURL\}
RedirectMatch 403 function\(\)
RedirectMatch 403 labels\.rdf
RedirectMatch 403 /playing.php
RedirectMatch 403 muieblackcat
</ifModule>
# 5G:[BAD IPS]
<limit GET POST PUT>
Order Allow,Deny
Allow from all
# uncomment/edit/repeat next line to block IPs
# Deny from 123.456.789<
</limit>

Ahora si podemos tener la seguridad de que nuestro WordPress esta a salvo de posibles ataques, eso si, estos métodos solo ayudan en ciertos momentos, los hackers son muy listos y encuentran como acceder a nuestro sitio por tanto por muchas medidas de seguridad que podamos utilizar nunca debemos olvidar realizar copias de seguridad regularmente por si acaso debemos hacer una restauración de emergencia.

Me interesa tu opinión, ¿que piensas al respecto?

  1. Gus

    Muy interesante pero me surge una duda:

    ¿Como podrías bloquear países desde el htaccess?

    Un ejemplo práctico sería que no me interesase recibir tráfico de Rusia, China… (por motivos que todos conocemos)y de esa forma ahorrar carga de servidor y ancho de banda.

    • Ricardo

      Hola Gus, desde htacces puedes restringir países, ips, bots…. pero si tienes tantas visitas desde esos lugares quizás deberías aprovecharlas o ¿son todo bots?

  2. Juan Manuel → En Twitter : No tengo :(

    Estimado Rcardo:
    Veo que eres un evezado en este tema.
    Si no te es inoportuno, podrias darme un ejemplo de una sintaxis para excluir paises, por htaccess ?
    Desde ya te quedo enormemente agradecido

    JMP